题目描述:
用迪杰斯特拉(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>
using namespace std;
int d[100002],pre[100001],line[100001],w[10001][10001];
bool flag[100002];
int n,m,s,t;
void dijkstra(int s){
int u=0;int min;
flag[s]=true;d[s]=0;
for (int i=1;i<=n;++i)
if (w[s][i]>0)
d[i]=w[s][i],pre[i]=s;
for (int k=1;k<=n-1;++k){
min=1000000;
for (int i=1;i<=n;++i)
if (!flag[i]&&d[i]<min)
min=d[i],u=i;
flag[u]=true;
for (int j=1;j<=n;++j)
if (w[u][j]>0&&d[j]>d[u]+w[u][j])
d[j]=d[u]+w[u][j],pre[j]=u;
}
}
int main(){
int a,b,c;
cin >>s>>t>>n>>m;
for (int i=1;i<=n;++i)
d[i]=10000000;
for (int i=1;i<=m;++i){
cin >>a>>b>>c;
w[a][b]=c;w[b][a]=c;
}
dijkstra(s);
cout <<d[t]<<endl;
int k=1;line[1]=t;
while (pre[t]!=0){
++k;line[k]=pre[t];
t=pre[t];
}
for (int i=k;i>=1;--i)
cout <<line[i]<<' ';
return 0;
}