单源最短路径
https://www.luogu.org/problemnew/show/P3371
题目背景
本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。
题目描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入输出格式
输入格式:
第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。
接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。
输出格式:
一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)
输入输出样例
说明
时空限制:1000ms,128M
数据规模:
对于20%的数据:N<=5,M<=15;
对于40%的数据:N<=100,M<=10000;
对于70%的数据:N<=1000,M<=100000;
对于100%的数据:N<=10000,M<=500000。保证数据随机。
对于真正 100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。
最短路模板题
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<string> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #define maxn 200005 10 #define INF 0x3f3f3f3f3f3f3f3f 11 using namespace std; 12 13 int n,m,k; 14 struct sair{ 15 long long len,pos; 16 friend bool operator<(sair a,sair b){ 17 return a.len>b.len; 18 } 19 }; 20 long long dis[maxn]; 21 long long vis[maxn]; 22 vector<pair<long long,long long> >v[maxn]; 23 void Dijstra(){ 24 priority_queue<sair>q; 25 sair tmp; 26 tmp.len=0,tmp.pos=k; 27 dis[k]=0; 28 q.push(tmp); 29 while(!q.empty()){ 30 tmp=q.top(); 31 q.pop(); 32 long long pos=tmp.pos; 33 if(vis[pos]){ 34 continue; 35 } 36 vis[pos]=1; 37 for(int i=0;i<v[pos].size();i++){ 38 long long f=v[pos][i].first; 39 long long len=v[pos][i].second; 40 41 if(dis[f]>dis[pos]+len){ 42 dis[f]=dis[pos]+len; 43 tmp.pos=f; 44 tmp.len=dis[f]; 45 q.push(tmp); 46 } 47 } 48 } 49 } 50 51 52 53 int main(){ 54 55 std::ios::sync_with_stdio(false); 56 int t; 57 cin>>n>>m>>k; 58 for(int i=0;i<=n;i++){ 59 for(int j=0;j<=k;j++){ 60 dis[i]=INF; 61 vis[i]=0; 62 } 63 } 64 for(int i=0;i<=n;i++){ 65 v[i].clear(); 66 } 67 int a,b,c; 68 int j; 69 for(int i=1;i<=m;i++){ 70 cin>>a>>b>>c; 71 v[a].push_back(make_pair(b,c)); 72 } 73 Dijstra(); 74 for(int i=1;i<=n;i++){ 75 if(k==i){ 76 cout<<0; 77 } 78 else if(dis[i]==INF){ 79 cout<<2147483647; 80 } 81 else{ 82 cout<<dis[i]; 83 } 84 if(i!=n) cout<<" "; 85 } 86 cout<<endl; 87 88 }