全部RE求助
查看原帖
全部RE求助
222039
wangzl楼主2022/5/21 10:55
#include <bits/stdc++.h>
#define N 3000 + 5
#define M 6000 + 5 + N
using namespace std;
int n, m;
bool vis[N];
int head[N], to[M], v[M], nxt[M], idx, val[N], cnt[N];
int dv[N];
inline int add(int a, int b, int c) {
    to[++idx] = b, v[idx] = c, nxt[idx] = head[a], head[a] = idx;
}
inline int read() {
    char c = getchar();
    int w = 1, s = 0;
    while (c < '0' || c > '9') {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        s = (s << 3) + (s << 1) + (c ^ 48);
        c = getchar();
    }
    return s * w;
}
inline void spfa() {
    queue<int> q;
    fill(val + 1, val + n + 1, 0x7fffffff);
    vis[0] = 1;
    val[0] = 0;
    q.push({0});
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        vis[u] = false;
        for(int i = head[u]; to[i]; i = nxt[i]) {
            if(val[to[i]] > val[u] + v[i]) {
                val[to[i]] = val[u] + v[i];
                if(!vis[to[i]]) {
                    ++cnt[to[i]];
                    if(cnt[to[i]] > n) {
                        puts("-1");
                        exit(0);
                    }
                    vis[to[i]] = true;
                    q.push({to[i]});
                }
            }
        }
    }
}
inline void dijkstra(int d) {
    priority_queue<pair<int, int>> q;
    fill(vis + 1, vis + n + 1, false);
    fill(dv + 1, dv + n + 1, 1e9);
    dv[d] = 0;
    q.push({0, d});
    while(q.size()) {
        int u = q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u] = true;
        for(int i = head[u]; to[i]; i = nxt[i]) {
            if(dv[to[i]] >  dv[u] + v[i] && !vis[to[i]]) {
                dv[to[i]] = dv[u] + v[i];
                q.push({- dv[to[i]], to[i]});
            }
        }
    }
}
int main() {
    n = read(), m = read();
    fill(head + 1, head + n + 1, -1);
    for (int i = 1; i <= m; ++i) {
        int a = read(), b = read(), c = read();
        add(a, b, c);
    }
    for (int i = 1; i <= n; ++i) {
        add(0, i, 0);
    }
    spfa();
    for (int i = 1; i <= n; ++i) {
        for(int j = head[i]; to[j]; j = nxt[j]) {
            v[j] = v[j] + val[i] - val[to[j]];
        }
    }
    for(int i = 1; i <= n; ++i) {
        dijkstra(i);
        long long ans = 0;
        for(int j = 1; j <= n; ++j) {
            ans += dv[j] == 1e9 ? j * dv[j] : j * (dv[j] + val[j] - val[i]);
        }
        printf("%lld\n", ans);
    }
    
}

12个点全部RE求调

2022/5/21 10:55
加载中...