0006:floyd求最短路径 水题

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 105
int 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;
}


你可能感兴趣的:(0006:floyd求最短路径 水题)