【模板】 Dijkstra單源最短路徑 (模板題:XJOI P1061)
阿新 • • 發佈:2019-02-09
題目描述:
用迪傑斯特拉(Dijkstra)演算法求單源最短路徑,並輸出路徑(按字典序輸出最小的一條)。
輸入格式:
第一行而個整數s,t第二行而個整數n,m
以下m行每行三個整數a,b,c,表示a,b之間有邊,且邊的權值為c
樣例輸入:
1 35 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; }