70 Pts,求调
查看原帖
70 Pts,求调
909549
LengSC楼主2024/4/7 14:00
#include <bits/stdc++.h>

using namespace std;

constexpr int N = 1e3 + 2, M = 1e5 + 2;

struct Edge {
    int v, w, ne;
};

Edge e[M];
int h[N], cnt;
int n, m, s;
int tu[N], tv[N], tw[N];
int dis[N], tmp[N], ans;
bool vis[N];
priority_queue<pair<int, int>> q;


void adde(const int &u, const int &v, const int &w) {
    e[++cnt].v = v;
    e[cnt].w = w;
    e[cnt].ne = h[u];
    h[u] = cnt;
}

void dij(const int &s) {
    memset(dis, 0x7f, sizeof(dis));
    dis[s] = 0;
    q.push(make_pair(-dis[s], s));
    while (!q.empty()) {
        int u = q.top().second;
        q.pop();
        if (vis[u]) continue;
        vis[u] = true;
        for (int i = h[u]; i; i = e[i].ne) {
            int v = e[i].v;
            if (dis[v] > dis[u] + e[i].w) {
                dis[v] = dis[u] + e[i].w;
                q.push(make_pair(-dis[v], v));
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    cin >> n >> m >> s;
    
    for (int i = 1; i <= m; ++i) {
        cin >> tu[i] >> tv[i] >> tw[i];
        adde(tu[i], tv[i], tw[i]);
    }
    dij(s);
    for (int i = 1; i <= n; ++i) {
        tmp[i] = dis[i];
    }
    
    cnt = 0;
    memset(h, 0, sizeof(h));
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= m; ++i) {
        adde(tv[i], tu[i], tw[i]);
    }
    dij(s);
    
    for (int i = 1; i <= n; ++i) {
        ans = max(ans, tmp[i] + dis[i]);
    }
    cout << ans << endl;
    return 0;
}

AC * 7, WA * 3

2024/4/7 14:00
加载中...