90分 #3TLE求助 同一套代码标准版已过
查看原帖
90分 #3TLE求助 同一套代码标准版已过
414554
joeyscave楼主2021/10/1 16:56

看了下讨论区 好像#3不是数据比较大的 不知道哪里出了问题
用的是优先队列,对重复的边和到自己的边做了判定

#include <bits/stdc++.h>

using namespace std;
int n, m, s, u, v, w;
typedef struct {
    int next;
    int weight;
} edge;
typedef struct {
    int dis;
    int num;
} node;
vector<vector<edge>> adj;
vector<bool> vis;
vector<node> d;
auto cmp = [](node &l, node &r) { return (l.dis > r.dis); };
priority_queue<node, vector<node>, decltype(cmp)> minHeap(cmp);

void dijkstra() {
    int visNum = 1;
    vis[s] = true;
    d[s].dis = 0;
    minHeap.push(d[s]);
    for (int i = 0; i < adj[s].size(); i++) {
        d[adj[s][i].next].dis = adj[s][i].weight;
        minHeap.push(d[adj[s][i].next]);
    }
    while (visNum != n) {
        node temp;
        while (true) {
            temp = minHeap.top();
            minHeap.pop();
            if (!vis[temp.num]) break;
        }
        vis[temp.num] = true;
        for (int i = 0; i < adj[temp.num].size(); i++) {
            int newDis = adj[temp.num][i].weight + temp.dis;
            int oldDis = d[adj[temp.num][i].next].dis;
            if (!vis[adj[temp.num][i].next] && newDis < oldDis) {
                node tem;
                tem.dis = newDis;
                d[adj[temp.num][i].next].dis = tem.dis;
                tem.num = adj[temp.num][i].next;
                minHeap.push(tem);
            }
        }
        visNum++;
    }
}

int main() {
    cin >> n >> m >> s;
    adj.resize(n + 1);
    vis.resize(n + 1, false);
    d.resize(n + 1);
    for (int i = 1; i <= n; i++) {
        d[i].dis = 0x7fffffff;
        d[i].num = i;
        edge temp;
        temp.next=i;
        temp.weight=0;
        adj[i].push_back(temp);
    }
    for (int i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        short flag = 0;
        for (int j = 0; j < adj[u].size(); j++) {
            if (adj[u][j].next == v) {
                if (adj[u][j].weight <= w) {
                    flag = 2;
                    break;
                } else {
                    flag = 1;
                    adj[u][j].weight = w;
                }
            }
        }
        if (flag == 0) {
            edge temp;
            temp.next = v;
            temp.weight = w;
            adj[u].push_back(temp);
        }
    }
    dijkstra();
    for (int i = 1; i <= n; i++) cout << d[i].dis << " ";
    return 0;
}
2021/10/1 16:56
加载中...