poj 1734 Sightseeing trip_ 最小环记录路径
题意:求最出小环,输出路径
#include <iostream> #include<cstdio> using namespace std; #define N 110 #define INF 0xffffff int map[N][N],n,m,dist[N][N],pre[N][N],path[N]; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void floyd(){ int i,j,k,ans=INF,num,p; for(i=0;i<=n;i++) for(j=0;j<=n;j++) dist[i][j]=map[i][j]; for(k=1;k<=n;k++){ for(i=1;i<k;i++) for(j=i+1;j<k;j++){ int tmp=dist[i][j]+map[i][k]+map[k][j]; if(tmp<ans){ ans=dist[i][j]+map[i][k]+map[k][j]; p=j; num=0; while(p!=i){ path[num++]=p; p=pre[i][p]; } path[num++]=i; path[num++]=k; } } for(i=1;i<=n;i++) for(j=1;j<=n;j++){ int tmp=dist[i][k]+dist[k][j]; if(dist[i][j]>dist[i][k]+dist[k][j]){ dist[i][j]=dist[i][k]+dist[k][j]; pre[i][j]=pre[k][j]; } } } if(ans==INF) printf("No solution.\n"); else{ printf("%d",path[0]); for(i=1;i<num;i++) printf(" %d",path[i]); puts(""); } } int main(int argc, char** argv) { int i,j,a,b,d; // freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++) for(j=1;j<=n;j++){ map[i][j]=INF; pre[i][j]=i; } for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&d); if(map[a][b]>d) map[a][b]=map[b][a]=d; } floyd(); } return 0; }
不怕路长,只怕心老.