Floyd+路径输出

来源:互联网 发布:linux ping脚本 编辑:程序博客网 时间:2024/06/05 10:52
#include <iostream> using namespace std; #include <stack>const int INF = 99999999; stack<int>s;int n,m;//n:顶点数,m:边数 struct node { int space; int pre; }map[110][110];//建图,map[i][j].space表示点i到点j的最短距离,map[i][j].pre表示点i到点j的"跳板" void input() { int i,j; for(i = 1; i <=n; i++) for(j = 1; j <=n; j++) { if(i==j) map[i][j].space = 0; else map[i][j].space = INF; map[i][j].pre = i; }//初始化 int a,b,x; for(i = 1; i <=m; i++) { cin>>a>>b>>x; map[a][b].space = x; }//存图 } void floyd()//floyd算法 { int k,i,j; for(k = 1; k <=n; k++) for(i = 1; i <=n; i++) for(j = 1; j <=n; j++) { if(map[i][k].space!=INF && map[k][j].space!=INF && map[i][k].space + map[k][j].space < map[i][j].space) { map[i][j].space = map[i][k].space + map[k][j].space; map[i][j].pre = k; } } } void output() { int i,j; for(i = 1; i <=n; i++) for(j = 1; j <=n; j++) { cout<<i<<"~"<<j<<"的最短距离:"<<map[i][j].space<<endl; int k = j; cout<<"路径:"<<i<<" "; while(map[i][k].pre!=i) { k = map[i][k].pre; s.push(k); } while(!s.empty()){cout<<s.top()<<" "; s.pop();} cout<<j<<" \n"; } } int main() { while(1) { cin>>n>>m; if(n+m==0)break; input(); floyd(); output(); } return 0; }

原创粉丝点击