floyed(MB-经典求环)

来源:互联网 发布:爱娱网络 狂龙 编辑:程序博客网 时间:2024/06/05 15:37

#include<cstdio>
#include<iostream>
#define N 105
#define inf (10000000)
#include<cstring>
using namespace std;
int mat[N][N],dis[N][N];
int m,n;
int min(int a,int b)
{
    return a<b?a:b;
}  
void Floyd()
{
    int i,j,k,ans=inf;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            dis[i][j]=mat[i][j];
  for(k=1;k<=n;k++)
  {
   for(i=1;i<=k;i++)
   {
    for(j=1;j<i;j++)
    {
     
                    ans= min(ans,dis[i][j]+mat[i][k]+mat[k][j]);
    }
   }
   for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
     
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    }
  }
  if(ans<inf)
   cout<<ans<<endl;
  else
   cout<<"It's impossible."<<endl;
  
}  

int main()
{
    int i,j;
    int a,b,c;
    while(cin>>n>>m)
    {
  for(i=1;i<=n;i++)
   for(j=1;j<=n;j++)
    mat[i][j]=inf;
   for(i=0;i<m;i++)
   {
    cin>>a>>b>>c;
    if(mat[a][b]>c)
    {
     mat[a][b]=c;
     mat[b][a]=c;
    }
   }
   Floyd();
 }
 return 0;
}