【最短路】洛谷_4779 单源最短路径(标准版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SSL_hzb/article/details/82735122

题意

给定一个 N 个点 M 条边的有向图,起点是 S ,求出起点到每个点的最短路

思路

堆优化过后的 d i j k s t r a 算法。

代码

#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]);
}

猜你喜欢

转载自blog.csdn.net/SSL_hzb/article/details/82735122