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\n",ans); 37 else 38 printf("It's impossible.\n"); 39 } 40 }
心之所动 且就随缘去吧