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