求解释
查看原帖
求解释
539211
lzyqwq楼主2022/8/26 21:27
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
int T, n, m, q[N], h, t, cnt, hd[N], ans, la[N], dis[N];
bool d[N];
struct edge {
    int v, w, c, nxt;
}e[N];
inline void add(int u, int v, int w, int c) {
    e[++cnt] = edge{v, w, c, hd[u]};
    hd[u] = cnt;
}
inline bool bfs() {
    for (int i = 0; i <= T; ++i) {
        d[i] = la[i] = 0;
        dis[i] = 1e9;
    }
    d[q[h = t = 1] = dis[0] = 0] = 1;
    while (h <= t) {
        int x = q[h++];
        d[x] = 0;
        for (int i = hd[x]; i; i = e[i].nxt) {
            if (e[i].w && dis[x] + e[i].c < dis[e[i].v]) {
                dis[e[i].v] = dis[x] + e[i].c;
                la[e[i].v] = i;
                if (!d[e[i].v]) {
                    d[q[++t] = e[i].v] = 1;
                }
            }
        }
    }
    return dis[T] < 1e9;
}
int main() {
    while (scanf("%d%d", &n, &m) != EOF) {
        cnt = 1;
        T = (n << 1) + 1;
        ans = 0;
        for (int i = 0; i <= T; ++i) {
            hd[i] = 0;
        }
        for (int u, v, w; m--;) {
            scanf("%d%d%d", &u, &v, &w);
            add(u + n, v, 1, w);
            add(v, u + n, 0, -w);
        }
        for (int i = 2; i < n; ++i){
            add(i, i + n, 1, 0);
            add(i + n, i, 0, 0);
        }
        add(1, n + 1, 2, 0);
        add(n + 1, 1, 0, 0);
        add(n, n << 1, 2, 0);
        add(n << 1, n, 0, 0);
        add(0, 1, 2, 0);
        add(1, 0, 0, 0);
        add(n << 1, T, 2, 0);
        add(T, n << 1, 0, 0);
        while (bfs()) {
            ans += dis[T];
            for (int i = T; i; i = e[la[i] ^ 1].v) {
                --e[la[i]].w;
                ++e[la[i] ^ 1].w;
            }
        }
        printf("%d\n", ans);
    }
}

这份 AC 代码,我一把第三行改成 const int N = 1e5RE 了,可是题解里面数组开的五万都能过,为什么呢?

2022/8/26 21:27
加载中...