1. 程式人生 > >【最短路】洛谷_4779 單源最短路徑(標準版)

【最短路】洛谷_4779 單源最短路徑(標準版)

題意

給定一個N個點M條邊的有向圖,起點是S,求出起點到每個點的最短路

思路

堆優化過後的dijkstra演算法。

程式碼

#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;

priority_queue< pair<int, int> > Q;

struct Edge{
    int to, v, next;
}e[200001];
int N, M, S, tot;
int head[100001], d[100001
], v[100001]; void add(int x, int y, int v) { e[++tot].to = y; e[tot].next = head[x]; e[tot].v = v; head[x] = tot; } void dijkstra(int S) { for (int i = 1; i <= N; i++) d[i] = 1073741824; memset(v, 0, sizeof(v)); d[S] = 0; Q.push(make_pair(0, S)); while (Q.size()) { int
x = Q.top().second; Q.pop(); if (v[x]) continue; v[x] = 1; for (int i = head[x]; i; i = e[i].next) { int y = e[i].to, z = e[i].v; if (d[y] > d[x] + z) { d[y] = d[x] + z; Q.push(make_pair(-d[y], y)); } } } } int
main() { scanf("%d %d %d", &N, &M, &S); int x, y, z; for (int i = 1; i <= M; i++) { scanf("%d %d %d", &x, &y, &z); add(x, y, z); } dijkstra(S); for (int i = 1; i <= N; i++) printf("%d ", d[i]); }