P3371 【模板】单源最短路径 如题

P3371 【模板】单源最短路径

  • 时空限制1s / 128MB

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入输出格式

输入格式:

第一行包含三个整数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

样例说明:

------------------------------------------------------------------------------------

SPFA模版:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define maxn 500010
 4 struct node{
 5     int to,next,w;
 6 };
 7 node e[maxn];
 8 int dis[maxn],n,m,s,pre[maxn],cnt,tream[maxn];
 9 bool po[maxn];
10 void spfa();
11 void build(int,int,int);
12 int main(){
13     scanf("%d %d %d",&n,&m,&s);
14     cnt=0;
15     for(int i=1;i<=m;i++){
16         int a,b,c;
17         scanf("%d %d %d",&a,&b,&c);
18         build(a,b,c);
19     }
20     memset(po,0,sizeof(po));
21     spfa();
22     for(int i=1;i<=n;i++) printf("%d ",dis[i]);
23     return 0;
24 }
25 void spfa(){
26     for(int i=1;i<=n;i++) dis[i]=2147483647;
27     int head=0,tail=1;
28     dis[s]=0;tream[tail]=s;
29     po[s]=1;
30     do{
31         head++;
32         int o=tream[head];
33         for(int i=pre[o];i;i=e[i].next){
34             int to=e[i].to;
35             if(dis[to]>dis[o]+e[i].w){
36                dis[to]=dis[o]+e[i].w;
37                if(!po[to]){
38                    po[to]=1;
39                    tream[++tail]=to;
40                }
41             }
42         }
43         po[o]=0;
44     }while(head<=tail);
45 }
46 void build(int x,int y,int z){
47     e[++cnt].to=y;e[cnt].next=pre[x];pre[x]=cnt;e[cnt].w=z;
48 }

SPFA

------------------------------------------------------------------------------------

Dijkstra模版:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define maxn 500010
 4 struct node{
 5     int to,next,w;
 6 };
 7 node e[maxn];
 8 int n,m,s,dis[maxn],pre[maxn],cnt;
 9 bool po[maxn];
10 void djs();
11 void build(int,int,int);
12 int main(){
13     scanf("%d %d %d",&n,&m,&s);
14     cnt=0;
15     for(int i=1;i<=m;i++){
16         int a,b,c;
17         scanf("%d %d %d",&a,&b,&c);
18         build(a,b,c);
19     }
20     djs();
21     for(int i=1;i<=n;i++) printf("%d ",dis[i]);
22     return 0;
23 }
24 void djs(){
25     memset(po,0,sizeof(po));
26     for(int i=1;i<=n;i++) dis[i]=2147483647;
27     dis[s]=0;
28     for(int i=1;i<=n;i++){
29         int mi=2147483647,p;
30         for(int j=1;j<=n;j++)
31            if(!po[j]&&dis[j]<mi){
32                mi=dis[j];
33                p=j;
34         }
35         po[p]=1;
36         for(int i=pre[p];i;i=e[i].next)
37            if(dis[e[i].to]>dis[p]+e[i].w)
38            dis[e[i].to]=dis[p]+e[i].w;
39     }
40 }
41 void build(int x,int y,int z){
42     e[++cnt].to=y;e[cnt].next=pre[x];pre[x]=cnt;e[cnt].w=z;
43 }

Dijkstra

时间: 2024-10-05 03:58:04

P3371 【模板】单源最短路径 如题的相关文章

luogu P3371 &amp; P4779 ---单源最短路径spfa &amp; 最大堆优化Dijkstra

P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i

【洛谷 p3371】模板-单源最短路径(图论)

题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<queue> 6 using namespace std; 7 typedef long long LL; 8 9 const int N=10010,M=500010; 10 c

[模板]单源最短路径(Dijkstra)

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 inline int read() 5 { int x=0;bool f=0;char ch=getchar(); 6 while(!isdigit(ch)){ f=(ch==45);ch=getchar();} 7 while(is

[模板]单源最短路径

https://www.luogu.org/problemnew/show/P3371 1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <queue> 5 #define lop(i,a,b) for(register int i=a;i<=b;++i) 6 const int N = 10010, M = 500010, inf = 214748364

P3371 【模板】单源最短路径(弱化版)

P3371 [模板]单源最短路径(弱化版) 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10005; 4 struct edge { 5 int v, w; 6 }; 7 vector<edge> maps[maxn]; 8 int dis[maxn]; 9 bool vis[maxn]; 10 int n, m, s; 11 void add(int u, int v, int w) {

Luogu 3371【模板】单源最短路径

Luogu 3371[模板]单源最短路径 第一次写博客用图论题来试一试 接下来是正文部分 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度 (若S=i则最短路径长度为0,若从点S无法到达

单源最短路径Dijkstra、BellmanFord、SPFA【模板】

Dijkstra算法: 将所有点分为两个集合.如果源点s到u的最短路径已经确定,点u就属于集合Va,否则属于集合Vb. 1.将源点s到图中各点的直接距离当做初始值记录为s到各点的最短距离,不能到达的记为INF.S到S距离为0. 2.在集合Vb中的点中找一个点u,使得源点s到该点u路径长度最短,将u从Vb中除去,加到V1中.这时候求出了当前S到u的最短路径. 3.把新确定的点u更新s到集合Vb中每一个点v的距离,如果s到u的距离加上u到v的直接距离小于当前s到v的距离,则表示新找到的最短路径长度比

单源最短路径(最短路)

洛谷——P3371 [模板]单源最短路径(spfa) 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为21474836

单源最短路径(dij+堆优化)

单源最短路径的模板题,感谢同学余能的帮助~ #include<bits/stdc++.h> #define inf 2147483647 using namespace std; bool book [200004]; int cnt=0; int head[200020]; int n,m,qq; struct Edge { int to,next,w; }e[2000005]; struct Dis { int to,w; }dis[20000]; struct cmp1 { bool o