hdu 1599 最小环
求无向图的最小环。。。。
floyd。。。。
具体见代码。。。
View Code
1 #include<iostream> 2 const int N=111; 3 const int inf=1000000; 4 #define min(x,y) ((x<y)?(x):(y)); 5 using namespace std; 6 7 int dist[N][N]; 8 int edge[N][N]; 9 int n,m; 10 11 void floyd(){ 12 int ans=inf; 13 for(int i=1;i<=n;i++){ 14 for(int j=1;j<=n;j++){ 15 dist[i][j]=edge[i][j]; 16 } 17 } 18 //根据Floyed的原理,在最外层循环做了k-1次之后,dis[i][j]则代表了i到j的路径中所有结点编号都小于k的最短路径 19 for(int k=1;k<=n;k++){ 20 //环的最小长度为edge[i][k]+edge[k][j]+i->j的路径中所有编号小于k的最短路径长度 21 for(int i=1;i<k;i++){ 22 for(int j=i+1;j<k;j++){ 23 if(dist[i][j]+edge[i][k]+edge[k][j]<inf){ 24 ans=min(ans,dist[i][j]+edge[i][k]+edge[k][j]); 25 } 26 } 27 } 28 //floyd原来的部分,更新dist[i][j]/// 29 for(int i=1;i<=n;i++){ 30 for(int j=1;j<=n;j++){ 31 if(dist[i][j]>dist[i][k]+dist[k][j]){ 32 dist[i][j]=dist[i][k]+dist[k][j]; 33 } 34 } 35 } 36 } 37 if(ans==inf){ 38 printf("It's impossible.\n"); 39 }else 40 printf("%d\n",ans); 41 } 42 43 44 int main(){ 45 while(scanf("%d%d",&n,&m)!=EOF){ 46 for(int i=1;i<=n;i++){ 47 for(int j=1;j<=n;j++){ 48 if(i==j){ 49 edge[i][j]=0; 50 }else 51 edge[i][j]=inf; 52 } 53 } 54 int x,y,cost; 55 for(int i=1;i<=m;i++){ 56 scanf("%d%d%d",&x,&y,&cost); 57 //考虑重边 58 if(edge[x][y]>cost){ 59 edge[x][y]=edge[y][x]=cost; 60 } 61 } 62 floyd(); 63 } 64 return 0; 65 }