求助P2865 [USACO06NOV] Roadblocks G
  • 板块学术版
  • 楼主zjy102512
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/6/22 09:00
  • 上次更新2024/6/22 12:25:16
查看原帖
求助P2865 [USACO06NOV] Roadblocks G
931394
zjy102512楼主2024/6/22 09:00

dij WA on#3#11

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;

struct Node {
    int d, l;
    bool operator>(const Node &a) const {
        return l > a.l;
    }
};

priority_queue<Node, vector<Node>, greater<Node>> q;
int dis[5005];
bool vis[5005];
int sdis[5005];
vector<int> head[10005];
struct Edge {
    int w, to;
};
vector<Edge> e[5005];

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

int n, m;

int main() {
    cin >> n >> m;
    int u, v, w;
    memset(dis, 0x7f, sizeof(dis));
    memset(sdis, 0x7f, sizeof(sdis));
    memset(vis, 0, sizeof(vis));

    for (int i = 0; i < m; ++i) {
        cin >> u >> v >> w;
        addEdge(u, v, w);
    }

    dis[1] = 0;
    q.push({1, 0});

    while (!q.empty()) {
        Node tmp = q.top();
        q.pop();
        int u = tmp.d;

        if (vis[u]) continue;
        vis[u] = true;

        for (Edge edge : e[u]) {
            int tw = edge.w;
            int t = edge.to;

            if (dis[t] > dis[u] + tw) {
                sdis[t] = dis[t];
                dis[t] = dis[u] + tw;
                q.push({t, dis[t]});
            }
            if (dis[u] + tw > dis[t] && dis[u] + tw < sdis[t]) {
                sdis[t] = dis[u] + tw;
                q.push({t, sdis[t]});
            }
            if (sdis[u] + tw < sdis[t] && sdis[u] + tw > dis[t]) {
                sdis[t] = sdis[u] + tw;
                q.push({t, sdis[t]});
            }
        }
    }

    cout << sdis[n] << endl;
    return 0;
}
2024/6/22 09:00
加载中...