Dijkstra 求助,大紫大红

P4779 【模板】单源最短路径(标准版)

__youzimo2014__ @ 2024-07-24 16:59:57

record\ 提交记录都放这里了,为什么还要贴代码

#include <bits/stdc++.h>
#define MAXN 100005
#define _INT_MAX_ 1000000000
using namespace std;
struct nod {
    int u, len;
    nod(int u_, int len_) {
        u = u_;
        len = len_;
    }
};

bool operator<(nod x, nod y) {
    if (x.len != y.len) return x.len < y.len;
    return x.u < y.u;
}
int dis[MAXN]; // dijkstra
bool vis[MAXN];
vector<int> G[MAXN], val[MAXN];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m, s;
    cin >> n >> m >> s;
    for (int i = 1; i <= m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        G[u].push_back(v);
        val[u].push_back(w);
    }
    for (int i = 1; i <= n; i++) {
        dis[i] = _INT_MAX_;
    }
    priority_queue<nod> q; // 堆优化
    q.push(nod(s, 0));
    dis[s] = 0;
    while(!q.empty()){
        auto [x, len] = q.top(); q.pop();
        vis[x] = true;
        for (int i = 0; i < G[x].size(); i++) {
            int v = G[x][i];
            if (!vis[v]) {
                dis[v] = min(dis[v], dis[x] + val[x][i]);
                q.push(nod(v, dis[v]));
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        cout << dis[i] << ' ';
    }
    cout << endl;
    return 0;
}

by jason_sun @ 2024-07-24 17:04:33

优先队列是大根堆,所以你的比较函数要反着写。

vis的位置不对,应该在poo后面判断vis @youzimo2014


by __youzimo2014__ @ 2024-07-24 17:11:40

@jason_sun 啊?Dij不是小根堆吗?


by 2c_s @ 2024-07-24 17:12:53

@youzimo2014 所以说要反着排序,优先队列大根堆转为 dij 的小根堆


by __youzimo2014__ @ 2024-07-24 17:13:45

@jason_sun 改了判断 pop 位置之后不 TLE 了


by __youzimo2014__ @ 2024-07-24 17:15:14

@2c_s 额,难道我记错了?

优先队列是大根堆?我去试试。


by __youzimo2014__ @ 2024-07-24 17:20:34

@jason_sun @2c_s 过了谢谢。

(话说优先队列好奇怪啊,大根堆认小于号)


|