链接:点击打开链接
题意:从中找出一个最短成环的路线,输出这个路线
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #define maxx 99999999 using namespace std; int n,m,t; int dis[105][105],w[105][105],pre[105][105],path[105]; int floyd(){ int i,j,k,p,x; x=maxx; for(k=1;k<=n;k++){ for(i=1;i<k;i++) for(j=i+1;j<k;j++) if(x>dis[i][j]+w[j][k]+w[k][i]){ x=dis[i][j]+w[j][k]+w[k][i]; p=j; t=0; while(p!=i){ //用path数组记录路径,pre数组记录j的前一个是什么 path[t++]=p; p=pre[i][p]; } path[t++]=i; path[t++]=k; //最后不要忘记j的前面还有i和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]; //更新j的pre数组值 } //floyd算法模板 } if(x<maxx) return 1; else return 0; //如果没有返回0 } int main(){ int i,j,a,b,c,temp; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++) for(j=1;j<=n;j++){ dis[i][j]=w[i][j]=maxx; pre[i][j]=i; //初始化pre数组 } for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); if(c<dis[a][b]){ //要考虑重边 dis[a][b]=dis[b][a]=c; w[a][b]=w[b][a]=c; } } temp=floyd(); if(temp){ for(i=0;i<t;i++) printf("%d ",path[i]); printf("\n"); } else printf("No solution.\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-08-19 06:38:51