题目描述:
用迪杰斯特拉(Dijkstra)算法求单源最短路径,并输出路径(按字典序输出最小的一条)。
输入格式:
第一行而个整数s,t第二行而个整数n,m
以下m行每行三个整数a,b,c,表示a,b之间有边,且边的权值为c
样例输入:
1 3
5 7
1 2 6
1 4 2
1 5 23
2 3 4
2 4 3
3 4 20
3 5 7
样例输出:
9
1 4 2 3
n,m<=1000
#include<iostream>
#include<cstdio>
using namespace std;
struct abc{
int d,p;
}k[1000000];
int n,m,s,t;
int v[1000000],u[1000000],w[10000000];
int res[1000000];
void reset(){
for (int i=1;i<=n;++i){
k[i].d=1e9;k[i].p=0;
}
}
void relax(int u,int v,int w){
if (k[v].d>k[u].d+w){
k[v].d=k[u].d+w;
k[v].p=u;
}
}
bool Ford(){
reset();k[s].d=0;
for (int i=1;i<=n-1;++i)
for (int j=1;j<=m;++j){
relax(u[j],v[j],w[j]);
//relax(v[j],u[j],w[j]);
}
for (int i=1;i<=m;++i)
if (k[v[i]].d>k[u[i]].d+w[i])
return false;
return true;
}
int main(){
cin >>s>>t>>n>>m;
for (int i=1;i<=m;++i)
cin >>u[i]>>v[i]>>w[i];
if (!Ford())
cout <<"You show me the wrong map!"<<endl;
else{
cout <<k[t].d<<endl;
int p=t,kk=0;
while (p!=s){
++kk;res[kk]=p;
p=k[p].p;
}
++kk;res[kk]=s;
for (int i=kk;i>=1;--i)
cout <<res[i]<<' ';
}
return 0;
}