POJ 1734 Sightseeing trip (floyd 求最小环)

参考来自:
http://hi.baidu.com/%D0%C4_%CB%E6_%C3%CE_%CF%E8/blog/item/403b9c58699c7642d0090675.html

/*
floyd 的扩展 找最小环 */ #include<stdio.h> #define maxn 200 #define inf 0xffffff int n,m; int dis[maxn][maxn],g[maxn][maxn],path[maxn],pre[maxn][maxn]; int min,cnt,mid; void floyd() { int i,j,k; for(k=1;k<=n;k++) { for(i=1;i<k;i++)//为了避免重复 { for(j=1;j<i;j++) { if(dis[i][j]+g[i][k]+g[k][j]<min)//找到更优解 { min=dis[i][j]+g[i][k]+g[k][j]; cnt=0; mid=j; while(mid!=i)//逆向寻找前驱结点直到找到最前面的i,i->…->j { path[cnt++]=mid; mid=pre[i][mid]; } path[cnt++]=i; path[cnt++]=k; } } } //求最短路 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(dis[i][j]>dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; pre[i][j]=pre[k][j];//更新前驱 } } } } } int main() { int i,j,a,b,c; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=n;i++) { for(j=0;j<=n;j++) { dis[i][j]=inf; g[i][j]=inf; pre[i][j]=i; } dis[i][i]=g[i][i]=0; } for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if(c<dis[a][b]) { dis[b][a]=dis[a][b]=c; g[a][b]=g[b][a]=c; } } min=inf; floyd(); if(min==inf)printf("No solution.\n"); else { printf("%d",path[0]); for(i=1;i<cnt;i++) { printf(" %d",path[i]); } printf("\n"); } } }
原文地址:https://www.cnblogs.com/acSzz/p/2492456.html