#4 一致 RE,救救蒟蒻吧!(orz)
  • 板块CF20C Dijkstra?
  • 楼主ronkeyson
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/25 00:06
  • 上次更新2024/7/25 09:25:54
查看原帖
#4 一致 RE,救救蒟蒻吧!(orz)
728688
ronkeyson楼主2024/7/25 00:06
#include <bits/stdc++.h>
#define ll long long

using namespace std;

struct Edge {
    int v;
    ll w;
};

struct Point {
    int p;
    ll w;
};

const int N = 2e5 + 5;

int n, m, s, pre[N];
bool vis[N], flag = false;
ll dis[N];
vector <Edge> e[N];
stack <int> sta;

struct cmp {
    bool operator()(Point &a, Point &b) {
        return a.w > b.w;
    }
};

priority_queue <Point, vector<Point>, cmp> q;

void add (int u, int v, int w) {
    e[u].push_back((Edge){v, w});
    e[v].push_back((Edge){u, w});
}

void Dijkstra (int n, int s) {
    memset(vis, false, sizeof(vis));
    memset(dis, 0x3f, sizeof(dis));
    dis[s] = 0;
    pre[s] = 0;
    q.push((Point){s, 0});
    int T = n;
    while (T--) {
        Point head = q.top();
        while (vis[head.p]) {
            q.pop();
            head = q.top();
        }
        int now = head.p;
        vis[now] = true;
        for (int i = 0; i < (int)(e[now].size()); i++) {
            int v = e[now][i].v;
            ll w = e[now][i].w;
            if (dis[v] > dis[now] + w) {
                dis[v] = dis[now] + w;
                q.push((Point){v, dis[v]});
                pre[v] = now;
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v;
        ll w;
        cin >> u >> v >> w;
        add(u, v, w);
    }
    Dijkstra(n, 1);
    for (int i = n; i; i = pre[i]) {
        if (i == 1) {
            flag = true;
        }
        sta.push(i);
    }
    if (!flag) {
        cout << -1;
        return 0;
    }
    while (!sta.empty()) {
        cout << sta.top() << ' ';
        sta.pop();
    }
    
    return 0;
}
2024/7/25 00:06
加载中...