hdu 1599 find the mincost route floyd求最小环

就是i到j的最短路,配上刚加入图的边,i到k,k到j,来构成一个没有重复边的环。

i到j是最短路,不会重复一条边两次,i到k,k到j刚加入图,显然也不会出现在最短路里。

要注意的是,求环的时候要保持i,j,k不相等。dis数组和初始的mp数组要区分开。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 int ans,n,m;
 6 int mp[110][110],dis[110][110];
 7 void floyd()
 8 {
 9     for (int k = 1;k <= n;k++)
10     {
11         for (int i = 1;i <= n;i++)
12             for (int j = 1;j <= n;j++)
13                 if (i != j && j != k && i != k)
14                     ans = min(ans,dis[i][j] + mp[j][k] + mp[k][i]);
15         for (int i = 1;i <= n;i++)
16             for (int j = 1;j <= n;j++)
17                 dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
18     }
19 }
20 int main()
21 {
22     while (scanf("%d%d",&n,&m) > 0)
23     {
24         memset(mp,0x1f,sizeof(mp));
25         memset(dis,0x1f,sizeof(dis));
26         ans = mp[0][0];
27         int tx,ty,tv;
28         for (int i = 1;i <= m;i++)
29         {
30             scanf("%d%d%d",&tx,&ty,&tv);
31             dis[tx][ty] = mp[tx][ty] = min(mp[tx][ty],tv);
32             dis[ty][tx] = mp[ty][tx] = min(mp[ty][tx],tv);
33         }
34         floyd();
35         if (ans != mp[0][0])
36             printf("%d
",ans);
37         else
38             printf("It's impossible.
");
39     }
40 }
心之所动 且就随缘去吧
原文地址:https://www.cnblogs.com/iat14/p/12076671.html