HDU - 1599 find the mincost route (Floyed求无向图最小环)

题目链接

Floyed动态加点, 每加一个点,求经过这个点的最小环,取min即可

注意inf相加溢出

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef double db;
 5 const int N=100+10,inf=0x3f3f3f3f;
 6 int n,m,g[N][N],f[N][N];
 7 int Floyed() {
 8     int ret=inf;
 9     for(int k=1; k<=n; ++k) {
10         for(int i=1; i<k; ++i)
11             for(int j=i+1; j<k; ++j)
12                 if(g[i][j]<inf&&f[i][k]<inf&&f[k][j]<inf)
13                     ret=min(ret,g[i][j]+f[i][k]+f[k][j]);
14         for(int i=1; i<=n; ++i)
15             for(int j=1; j<=n; ++j)
16                 g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
17     }
18     return ret;
19 }
20 
21 int main() {
22     while(~scanf("%d%d",&n,&m)) {
23         for(int i=1; i<=n; ++i)
24             for(int j=1; j<=n; ++j)
25                 f[i][j]=g[i][j]=inf;
26         while(m--) {
27             int u,v,c;
28             scanf("%d%d%d",&u,&v,&c);
29             if(f[u][v]>c)f[u][v]=f[v][u]=g[u][v]=g[v][u]=c;
30         }
31         int ans=Floyed();
32         if(ans==inf)puts("It's impossible.");
33         else printf("%d\n",ans);
34     }
35     return 0;
36 }

 

posted @ 2021-04-04 12:32  jrltx  阅读(57)  评论(0编辑  收藏  举报