求救,谢谢
查看原帖
求救,谢谢
398294
C__K楼主2020/10/4 23:12
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define INF 0x3f3f3f3f
int read()
{
    int x = 0, f = 1; char ch = getchar();
    while (!isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();}
    while (isdigit(ch)) {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
    return x * f;
}
int n, m, s, tot, dis[N], vis[N], head[N];
struct node
{
    int to;
    int nxt;
    int dis;
}h[N * 2];
void add(int u, int v, int d)
{
    h[++ tot].to = v;
    h[tot].nxt = head[u];
    h[tot].dis = d;
    head[u] = tot;
}
struct cmp
{
    bool operator()(int a, int b)
    {
        return dis[a] > dis[b];
    }
};
priority_queue<int, vector<int>, cmp> q;
void Dijkstra(int x)
{
    for (int i = 1; i <= n; i ++) dis[i] = INF;
    q.push(x);
    dis[x] = 0;
    while (!q.empty())
    {
        int now = q.top(); q.pop();
        if (vis[now]) continue;
        vis[now] = 1;
        for (int j = head[now]; j; j = h[j].nxt)
        {
            int to = h[j].to;
            if (vis[to]) continue;
            if (dis[to] > dis[now] + h[j].dis)
            {
                dis[to] = dis[now] + h[j].dis;
                q.push(to);
            }
        }
    }
}
int main()
{
    n = read(), m = read(), s = read();
    for (int i = 1; i <= m; i ++)
    {
        int u = read(), v = read(), d = read();
        add(u, v, d);
    }
    Dijkstra(s);
    for (int i = 1; i <= n; i ++) printf("%d ", dis[i]);
    printf("\n");
    return 0;
}
2020/10/4 23:12
加载中...