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) {
12     maps[u].push_back(edge{v,w});
13 }
14 void spfa(int s) {
15     for (int i = 1; i <= n; i++) {
16         dis[i] = 2147483647;
17         vis[i] = false;
18     }
19     queue<int> que;
20     que.push(s), dis[s] = 0, vis[s] = true;
21     while(!que.empty()) {
22         int u = que.front();
23         que.pop();
24         vis[u] = false;
25         for(int i = 0; i < maps[u].size(); i++) {
26             int v = maps[u][i].v;
27             int w = maps[u][i].w;
28             if(dis[v] > dis[u]+w) {
29                 dis[v] = dis[u] + w;
30                 if(vis[v] == false) {
31                     que.push(v);
32                     vis[v] = true;
33                 }
34             }
35         }
36     }
37 }
38 int main() {
39     scanf("%d%d%d",&n,&m,&s);
40     for(int i = 1; i <= m; i++) {
41         int u, v, w; scanf("%d%d%d",&u,&v,&w);
42         add(u,v,w);
43     }
44     spfa(s);
45     printf("%d",dis[1]);
46     for (int i = 2; i <= n; i++)
47         printf(" %d",dis[i]);
48     printf("\n");
49     return 0;
50 }

spfa

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 10005, inf = 0x3f3f3f3f;
 5 struct Edge {
 6     int from, to, dist;
 7 };
 8 struct HeapNode {
 9     int d, u;
10     bool operator < (const HeapNode& rhs) const {
11         return d > rhs.d;
12     }
13 };
14 struct Dijkstra {
15     int n, m;
16     vector<Edge> edges;
17     vector<int> G[maxn];
18     bool done[maxn];
19     int d[maxn];
20     int p[maxn];
21
22     void init(int n) {
23         this->n = n;
24         for (int i = 1; i <= n; i++) G[i].clear();
25         edges.clear();
26     }
27
28     void AddEdge(int from, int to, int dist) {
29         edges.push_back((Edge){from, to, dist});
30         m = edges.size();
31         G[from].push_back(m-1);
32     }
33     void dijkstra(int s) {
34         priority_queue<HeapNode> Q;
35         for (int i = 1; i <= n; i++) d[i] = inf;
36         d[s] = 0;
37         memset(done, 0, sizeof(done));
38         Q.push((HeapNode){0, s});
39         while (!Q.empty()) {
40             HeapNode x = Q.top(); Q.pop();
41             int u = x.u;
42             if (done[u]) continue;
43             done[u] = true;
44             for (int i = 0; i < G[u].size(); i++) {
45                 Edge & e = edges[G[u][i]];
46                 if (d[e.to] > d[u] + e.dist) {
47                     d[e.to] = d[u] + e.dist;
48                     p[e.to] = G[u][i];
49                     Q.push((HeapNode){d[e.to], e.to});
50                 }
51             }
52         }
53     }
54 };
55 int main() {
56     int n, m, s; scanf("%d%d%d",&n,&m,&s);
57     Dijkstra dij;
58     dij.init(n);
59     for (int i = 1; i <= m; i++) {
60         int u, v, w; scanf("%d%d%d",&u,&v,&w);
61         dij.AddEdge(u,v,w);
62     }
63     dij.dijkstra(s);
64     printf("%d",dij.d[1]==inf ? 2147483647 : dij.d[1]);
65     for (int i = 2; i <= n; i++)
66         printf(" %d",dij.d[i]==inf ? 2147483647 : dij.d[i]);
67     printf("\n");
68     return 0;
69 }

dijkstra

原文地址:https://www.cnblogs.com/wstong/p/11745272.html

时间: 2024-10-09 08:23:43

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

[模板]单源最短路径

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

[模板]单源最短路径(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

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无法到达

单源最短路径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的距离,则表示新找到的最短路径长度比

Dijkstra算法求单源最短路径

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

Dijkstra单源最短路径

Dijkstra单源最短路径 给定一个带权有向图G=(V,E) ,其中每条边的权是一个非负实数.另外,还给定 V 中的一个顶点,称为源.现在我们要计算从源到所有其他各顶点的最短路径长度.这里的长度是指路上各边权之和.这个问题通常称为单源最短路径问题. 下面给出两个计算单源最短路径的模板. Dijkstra_简化版:时间复杂度O(n^2),不可处理重边图 //计算图的以s点为起点的单源最短路径 //图中节点从1到n编号 //运行dijkstrea之前,需要先把图中两点间的距离保存在dist[i][