HDU - 1599 find the mincost route (Floyed求无向图最小环)
题目链接
Floyed动态加点, 每加一个点,求经过这个点的最小环,取min即可
注意inf相加溢出
1 #include2 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 i) 11 for(int j=i+1; j j) 12 if(g[i][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 }