Dijsktra模板

xiaoxiao2021-02-28  149

题目描述

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

输入输出格式

输入格式:

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

样例说明:

【题解】

#include <cstdio> #include <vector> #include <queue> #include <cstring> #define INF 2147483647 using namespace std; const int maxn = 10010; struct Edge { int from, to, dist; Edge(int u, int v, int d) : from(u), to(v), dist(d) {} }; struct HeapNode { int d, u; bool operator<(const HeapNode &rhs) const { return d > rhs.d; } }; int n, SizeM, d[maxn]; vector<Edge> edges; vector<int> G[maxn]; bool done[maxn]; void init() { for (int i = 0; i < n; i++) G[i].clear(); } void AddEdge(int from, int to, int dist) { edges.push_back(Edge(from, to, dist)); SizeM = edges.size(); G[from].push_back(SizeM - 1); } void dijkstra(int S) { priority_queue<HeapNode> Q; for (int i = 0; i < n; i++) d[i] = INF; d[S] = 0; memset(done, 0, sizeof(done)); Q.push((HeapNode){0, S}); while (!Q.empty()) { HeapNode x = Q.top(); Q.pop(); int u = x.u; if (done[u]) continue; done[u] = true; for (int i = 0; i < G[u].size(); i++) { Edge &e = edges[G[u][i]]; if (d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; Q.push((HeapNode){d[e.to], e.to}); } } } } int main() { int S, from, to, dist, m; scanf("%d%d%d", &n, &m, &S); init(); for (int i = 0; i < m; i++) { scanf("%d%d%d", &from, &to, &dist); AddEdge(from - 1, to - 1, dist); } dijkstra(S - 1); for (int i = 0; i < n; i++) { if (i) printf(" "); printf("%d", d[i]); } printf("\n"); return 0; }

转载请注明原文地址: https://www.6miu.com/read-43538.html

最新回复(0)