#include <iostream> using namespace std; #define NoEdge 1000 typedef struct { char *vertices;//图的顶点 int num;//顶点数量 int **edge;//边的权值 }Graph; class Floyd { private: int **dist;//最短路径权值和 int **path;//最短路径的前驱顶点 Graph graph;//邻接矩阵图 public: Floyd(int num) { graph.num=num; dist=new int* [num+1]; path=new int* [num+1]; graph.edge=new int* [num+1]; graph.vertices=new char [num+1]; for(int i=0;i<=num;i++) { dist[i]=new int [num+1]; path[i]=new int [num+1]; graph.edge[i]=new int [num+1]; } } void input() { for(int i=1;i<=graph.num;i++) { cin>>graph.vertices[i]; } for(int i=1;i<=graph.num;i++) { for(int j=i+1;j<=graph.num;j++) { cout<<graph.vertices[i]<<","<<graph.vertices[j]<<endl; cin>>graph.edge[i][j]; cout<<graph.vertices[j]<<","<<graph.vertices[i]<<endl; cin>>graph.edge[j][i]; } } } void floyd() { for(int i=1;i<=graph.num;i++) { for(int j=1;j<=graph.num;j++) { if(i!=j) { dist[i][j]=graph.edge[i][j]; } else { dist[i][j]=0; } } } for(int k=1;k<=graph.num;k++) { for(int i=1;i<=graph.num;i++) { for(int j=1;j<=graph.num;j++) { if(i!=k&&j!=k&&i!=j) { if(dist[k][j]==NoEdge||dist[i][k]==NoEdge) { dist[i][j]=dist[i][j]; } else { dist[i][j]=dist[i][j]<=dist[i][k]+dist[k][j]? dist[i][j]:dist[i][k]+dist[k][j]; } } } } } } void getPath() { for(int i=1;i<=graph.num;i++) { for(int j=1;j<=graph.num;j++) { if(dist[i][j]==NoEdge) { path[i][j]=-1; } else { for(int k=1;k<=graph.num;k++) { if(j!=k) { if(dist[i][k]+graph.edge[k][j]==dist[i][j]) { path[i][j]=k; } } } } } } } void printPath(int i,int j) { if(dist[i][j]==NoEdge) { exit(-1); } if(i==j) { cout<<graph.vertices[i]<<" "; return; } printPath(i,path[i][j]); cout<<graph.vertices[j]<<" "; } }; void main() { Floyd test(6); test.input(); test.floyd(); test.getPath(); test.printPath(6,1); }