【模板】Ford单源最短路径

来源:互联网 发布:弟子知罪,愿受师父责罚 编辑:程序博客网 时间:2024/05/19 20:37

题目描述:

用迪杰斯特拉(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;}



原创粉丝点击