求助,WA60。。。QAQ
查看原帖
求助,WA60。。。QAQ
725807
lizeyuannb楼主2022/9/3 10:58

RT

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;

const int N = 1e3 + 5;
typedef long long ll;
typedef pair<ll, int> P;

int n, m, x;
ll ans, dis1[N], dis2[N];

bool vis1[N], vis2[N];
vector<P> g[N], f[N];

void Dij1(int s) {
    memset(dis1, 0x3f, sizeof(dis1));
    priority_queue<P, vector<P>, greater<P> > q;
    dis1[x] = 0; q.push(P(0, s));
    while(!q.empty()) {
        int u = q.top().y; q.pop();
        if(vis1[u]) continue;
        vis1[u] = 1;
        for(int i = 0; i < g[u].size(); i ++) {
            P v = g[u][i];
            if(dis1[v.y] > dis1[u] + v.x) {
                dis1[v.y] = dis1[u] + v.x;
                q.push(v);
            }
        }
    }
}
void Dij2(int s) {
    memset(dis2, 0x3f, sizeof(dis2));
    priority_queue<P, vector<P>, greater<P> > q;
    dis2[x] = 0; q.push(P(0, s));
    while(!q.empty()) {
        int u = q.top().y; q.pop();
        if(vis2[u]) continue;
        vis2[u] = 1;
        for(int i = 0; i < f[u].size(); i ++) {
            P v = f[u][i];
            if(dis2[v.y] > dis2[u] + v.x) {
                dis2[v.y] = dis2[u] + v.x;
                q.push(v);
            }
        }
    }
}

int main() {
    scanf("%d%d%d", &n, &m, &x);
    for(int i = 1, u, v, w; i <= m; i ++) {
        scanf("%d%d%d", &u, &v, &w);
        g[u].push_back(P(w, v));
        f[v].push_back(P(w, u));
    }
    Dij1(x); // from x to i (in g)
    Dij2(x); // from i to x = from x to i (in f)
    for(int i = 1; i <= n; i ++) 
        ans = max(ans, dis1[i] + dis2[i]);
    cout << ans;
    return 0;
}
2022/9/3 10:58
加载中...