#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 = 1e5 就 RE 了,可是题解里面数组开的五万都能过,为什么呢?