[模板]洛谷T3371 单源最短路径 SPFA+手工队列类

一年之后又重新学习此算法。。。233。。。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<ctime>
  6 #include<cstdlib>
  7
  8 #include<string>
  9 #include<stack>
 10 //#include<queue>
 11 #include<vector>
 12 #include<algorithm>
 13 #include<map>
 14 #include<set>
 15
 16 using namespace std;
 17
 18 inline void read(int &x){
 19     x=0;
 20     char t=getchar();
 21     bool f=0;
 22
 23     while(t<‘0‘ || t>‘9‘){
 24         if(t==‘-‘)f=1;
 25         t=getchar();
 26     }
 27
 28     while(t>=‘0‘ && t<=‘9‘){
 29         x=(x<<3)+(x<<1)+t-‘0‘;
 30         t=getchar();
 31     }
 32
 33     if(f)x=-x;
 34 }
 35
 36 struct que{
 37     int head,tail;
 38     int q[10001];
 39
 40     void build(){
 41         head=0;
 42         tail=0;
 43     }
 44
 45     bool emp(){
 46         return head==tail;
 47     }
 48
 49     void push(int x){
 50         q[tail]=x;
 51         tail++;
 52         if(tail==10001)tail=0;
 53     }
 54
 55     void pop(){
 56         head++;
 57         if(head==10001)head=0;
 58     }
 59
 60     int end(){
 61         if(tail==0)return q[10000];
 62         else return q[tail-1];
 63     }
 64
 65     int begin(){
 66         return q[head];
 67     }
 68 };
 69
 70 void start();
 71 void SPFA();
 72
 73 que line;
 74 bool pd[10010];
 75 int d[10010];
 76
 77 int u[500010];
 78 int v[500010];
 79 int w[500010];
 80 int first[10010];
 81 int next[500010];
 82
 83 int n,m,s,i;
 84
 85 int main(){
 86     start();
 87
 88     read(n);read(m);read(s);
 89
 90     for(i=1;i<=m;i++){
 91         read(u[i]);read(v[i]);read(w[i]);
 92         next[i]=first[u[i]];
 93         first[u[i]]=i;
 94     }
 95
 96     SPFA();
 97
 98     for(i=1;i<=n;i++){
 99         if(d[i]!=0x3f3f3f3f)printf("%d ",d[i]);
100         else printf("2147483647 ");
101     }
102
103     return 0;
104 }
105
106 void start(){
107     line.build();
108     memset(pd,0,sizeof(pd));
109     memset(d,0x3f3f3f3f,sizeof(d));
110
111     memset(first,0,sizeof(first));
112     memset(next,0,sizeof(next));
113 }
114
115 void SPFA(){
116     int t;
117
118     line.push(s);
119     pd[s]=1;
120     d[s]=0;
121
122     while(!line.emp()){
123         t=first[line.begin()];
124         while(t!=0){
125             if(d[v[t]]>d[u[t]]+w[t]){
126                 d[v[t]]=d[u[t]]+w[t];
127                 if(pd[v[t]]==0){
128                     line.push(v[t]);
129                     pd[v[t]]=1;
130                 }
131             }
132             t=next[t];
133         }
134         pd[line.begin()]=0;
135         line.pop();
136     }
137 }
时间: 2024-11-03 05:33:19

[模板]洛谷T3371 单源最短路径 SPFA+手工队列类的相关文章

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

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

【20171109】Luogu P3371 【模板】单源最短路径--SPFA

题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647) 输入输出样例 输入样例#1:复制 4 6 1

单源最短路径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 【模板】单源最短路径 如题

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

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

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

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) {

SPFA算法-单源最短路径算法

1.介绍: SPFA算法:单源最短路径算法,一种高效的最短路径算法! 2.思路 (1)初始化 1>源点路径为0  :d[s]=0 ,其中s为源点 2>初始化d[N]为无穷大,即d[i]表示,源点s到i为无穷大INF 3>p[N]初始化为源点s或-1,表示没有前驱 (2)队列+松弛 1>读取队头顶点u,并将队头顶点u出队(记得消除标记): 2>将与点u相连的所有点v进行松弛操作,如果能更新估计值(即令d[v]变小),那么就更新; 3>另外,如果点v没有在队列中,那么要将点

单源最短路径(最短路)

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

Dijkstra算法求单源最短路径

1.最短路径 在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同.如果是一个带权图,那么路径长度为路径上各边的权值的总和.两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度. 最短路径在实际中有重要的应用价值.如用顶点表示城市,边表示两城市之间的道路,边上的权值表示两城市之间的距离.那么城市A到城市B连通的情况下,哪条路径距离最短呢,这样的问题可以归结为最短路径问题. 求最短路径常见的算法有Dijkstra算法和Floyd算法