0006:floyd求最短路径 水题

来源:互联网 发布:数据录入员 编辑:程序博客网 时间:2024/05/17 00:58

0006:floyd求最短路径


  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
10000ms 
内存限制: 
1000kB
描述

给出一个有向图的结构,求所有顶点间的最短路径

输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有3个数,分别是该条弧所关联的两个顶点编号和弧的权值
输出
若干行
每行第一个为一个整数,为最短路径值,其余为若干个空格隔开的顶点构成的最短路径序列(用小写字母)
若无最短路径,直接输出no answer
样例输入
3 50 1 40 2 111 0 61 2 22 0 3
样例输出
4 v0 v16 v0 v1 v25 v1 v2 v02 v1 v23 v2 v07 v2 v0 v1
 #include "iostream"#include "stack"using namespace std;#define Sky 9999#define Max 105int Top,Edge,Map[Max][Max]; int Path[Max][Max];void Dfs(int x,int y){     int k=Path[x][y];     if(k==-1) return; Dfs(x,k); cout<<"v"<<k<<" "; Dfs(k,y);} void Floyd(){    int i,j,k;    for(k=0;k<Top;k++)for(j=0;j<Top;j++)for(i=0;i<Top;i++){   if(k==j || k==i || i==j) continue;if(Map[i][j]>Map[i][k]+Map[k][j]){Map[i][j]=Map[i][k]+Map[k][j];Path[i][j]=k;}}  bool Flag=false;for(i=0;i<Top;i++)for(j=0;j<Top;j++){         if(Map[i][j]!=Sky) { Flag=true;             cout<<Map[i][j]<<" ";  cout<<"v"<<i<<" ";             Dfs(i,j); cout<<"v"<<j<<" "<<endl; }}     if(Flag==false)   cout<<"no answer"<<endl;  }int main(){        //freopen("1.txt","r",stdin);    while(cin>>Top>>Edge  && Top!=0){int i,j;       for(i=0;i<Top;i++)for(j=0;j<Top;j++){Map[i][j]=Sky;Path[i][j]=-1;}        for(i=1;i<=Edge;i++){            int x,y,z;cin>>x>>y>>z;Map[x][y]=z; }        Floyd();    }    return 0;}


0 0
原创粉丝点击