单源最短路径

单源最短路径

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)

输入输出样例

输入样例#1: 
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出样例#1: 
0 2 4 3

说明

时空限制: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 }
View Code

猜你喜欢

转载自www.cnblogs.com/Fighting-sh/p/9904913.html