您的位置:首页 > 其它

0006:floyd求最短路径 水题

2016-05-14 12:02 435 查看

0006:floyd求最短路径

查看提交统计提问总时间限制: 10000ms 内存限制: 1000kB描述给出一个有向图的结构,求所有顶点间的最短路径输入若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有3个数,分别是该条弧所关联的两个顶点编号和弧的权值输出若干行每行第一个为一个整数,为最短路径值,其余为若干个空格隔开的顶点构成的最短路径序列(用小写字母)若无最短路径,直接输出no answer样例输入
3 5
0 1 4
0 2 11
1 0 6
1 2 2
2 0 3
样例输出
4 v0 v1
6 v0 v1 v2
5 v1 v2 v0
2 v1 v2
3 v2 v0
7 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;}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: