Floyd求最小环

http://acm.hdu.edu.cn/showproblem.php?pid=1599

 1 Problem : 1599 ( find the mincost route )     Judge Status : Accepted
 2 RunId : 10374468    Language : C++    Author : l1285556798
 3 Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
 4 
 5 #include<stdio.h>
 6 #define INF 0xffffff
 7 int map[301][301],dist[301][301];
 8 int n,m,ans;
 9 void floyd()
10 {
11     for(int i=1;i<=n;i++)
12         for(int j=1;j<=n;j++)
13         dist[i][j]=map[i][j];
14     for(int k=1;k<=n;k++)
15     {
16         for(int i=1;i<=n;i++)
17         {
18             for(int j=1;j<=n;j++)
19             {
20                 if(i!=j&&j!=k&&k!=i&&dist[i][j]!=INF&&map[j][k]!=INF&&map[k][i]!=INF&&dist[i][j]+map[j][k]+map[k][i]<ans)
21                     ans=dist[i][j]+map[j][k]+map[k][i];
22             }
23         }
24         for(int i=1;i<=n;i++)
25         {
26             for(int j=1;j<=n;j++)
27             {
28                 if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][k]+dist[k][j]<dist[i][j])
29                     dist[i][j]=dist[i][k]+dist[k][j];   //注意取不同点
30             }
31         }
32     }
33 }
34 int main()
35 {
36     while(scanf("%d%d",&n,&m)!=EOF)
37     {
38         for(int i=1;i<=n;i++)
39             for(int j=1;j<=n;j++)
40         {
41             if(i!=j)
42                 map[i][j]=INF;
43             else
44                 map[i][j]=0;
45         }
46         int a,b,c;
47         for(int i=0;i<m;i++)
48         {
49             scanf("%d%d%d",&a,&b,&c);
50             if(a!=b&&c<map[a][b])
51                 map[a][b]=map[b][a]=c;
52         }
53         ans=INF;
54         floyd();
55         if(ans==INF)
56             printf("It's impossible.\n");
57         else
58             printf("%d\n",ans);
59     }
60     return 0;
61 }

 

posted @ 2014-03-23 11:45  清风旋叶  阅读(135)  评论(0编辑  收藏  举报