dijkstra求最短路径(水题)

0007:dijkstra求最短路径

总时间限制: 
10000ms 
内存限制: 
1000kB
描述

给出一个有向图的结构,求某个顶点到另一点的最短路径

输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,第二行为起点编号s和终点编号e,接下来有a行,每一行有3个数,分别是该条弧所关联的两个顶点编号和弧的权值
输出
第一行为一个整数,为最短路径值

第二行为若干个空格隔开的顶点构成的最短路径序列(用小写字母)

若无最短路径,直接输出no answer

样例输入
6 8
0 3
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
样例输出
50

v0 v4 v3

 
#include "iostream"
#include "stack"
using namespace std;
#define Sky 9999
#define Max 105
int Top,Edge,Pre[Max],Start,End,Map[Max][Max],Dist[Max];
bool Move[Max];

bool Dij()
{ 
    int i,j;
    bool Flag;
	for(i=0;i<Top;i++)
	{
     Dist[i]=Map[Start][i];
     Move[i]=false;
	 if(Dist[i]!=Sky)
	 Pre[i]=Start;
	 else
	 Pre[i]=-1;
	}
    Dist[Start]=0;
    Move[Start]=true;
    for(i=0;i<Top;i++)
	{
	 int min=Sky,k=-1;
     
	 for(j=0;j<Top;j++)
	 {
		 if(min>Dist[j] && !Move[j])
		 {
			k=j;
			min=Dist[j];
		 }
	 }
	
     if(k==-1  || k==End) 
	 {
		if(k==-1) 
		Flag=false;
		else
		Flag=true;

		break;
	 }
	 Move[k]=true;
	 for(j=0;j<Top;j++)
	 {
		 if(!Move[j] && Dist[j]>Dist[k]+Map[k][j])
		 {
			 Dist[j]=Dist[k]+Map[k][j];
			 Pre[j]=k;
		 }
	 }
	}  
	return Flag;
}

void Output()
{ 

	 stack<int> Way;
	  
	 int item;
	 item=Pre[End];
	 Way.push(item);
	 while(Start!=item)
	 {   
		 item=Pre[item];
		 Way.push(item);
	 }
	 
	 cout<<Dist[End]<<endl;
	 
     while(!Way.empty())
	 { 
		 cout<<"v"<<Way.top()<<" ";
		 Way.pop();
	 }
     cout<<"v"<<End;
}

int main()
{    
	
	// freopen("1.txt","r",stdin);
	 while(cin>>Top>>Edge  && Top!=0)
	 { 
	 cin>>Start>>End;
     int i,j;
	 for(i=0;i<Top;i++)
	 for(j=0;j<Top;j++)
	 Map[i][j]=Sky;

     for(i=0;i<Edge;i++)
	 {
		 int x,y,z;
		 cin>>x>>y>>z;
		 Map[x][y]=z;
	 }

	 if(!Dij())
	 cout<<"no answer"<<endl;
	 else
	 Output();

	 cout<<endl;

	 }




	return 0;
}
    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/qq_34125999/article/details/51404622
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞