建图确认写对了,但是不知道 Isap 哪里跑错了
# include <iostream>
# include <cstdio>
# include <queue>
# include <cstring>
using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 2e6 + 5;
const int inf = 0x3f3f3f3f;
int n , m;
int x , y , z;
typedef struct {
int x , y , z , next;
}Edge;
Edge edge[maxm];
int E = 1 , elast[maxn];
void add(int x , int y , int z) {
E ++;
edge[E].x = x;
edge[E].y = y;
edge[E].z = z;
edge[E].next = elast[x];
}
int dis[maxn] , cnt[maxn];
int cur[maxn];
int S , T;
void bfs(int start) {
queue<int> q;
dis[start] = 0;
cnt[S] = 1;
q.push(start);
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = elast[cur] ; i ; i = edge[i].next) {
int v = edge[i].y;
if (dis[v] != -1) continue;
dis[v] = dis[cur] + 1;
q.push(v);
cnt[dis[v]] ++;
}
}
}
int dfs(int u , int flow) {
if (u == T) return flow;
int temp , delta = 0;
for (int i = cur[u] ; i ; i = edge[i].next) {
cur[u] = i;
int v = edge[i].y;
if (edge[i].z > 0 && dis[u] == dis[v] + 1) {
temp = dfs(v , min(flow - delta , edge[i].z));
edge[i].z -= temp;
edge[i ^ 1].z += temp;
delta += temp;
if (delta == flow) return delta;
}
}
if (dis[S] >= T) return delta;
cur[u] = elast[u];
if (-- cnt[dis[u]] == 0) dis[S] = T;
cnt[++ dis[u]] ++;
return delta;
}
int Isap() {
int Ans = 0;
memset(cnt , 0 , sizeof cnt);
memset(dis , -1 , sizeof dis);
for (int i = 1 ; i <= T ; i ++) {
cur[i] = elast[i];
}
bfs(T);
while (dis[S] < T) {
Ans += dfs(S , inf);
}
return Ans;
}
int sum = 0;
int main() {
cin >> n >> m;
S = 0 , T = n + m + 1;
for (int i = 1 ; i <= n ; i ++) {
scanf("%d" , &x);
add(i , T , x);
add(T , i , 0);
}
for (int i = 1 ; i <= m ; i ++) {
scanf("%d%d%d" , &x , &y , &z);
add(S , i + n , z);
add(i + n , S , 0);
add(i + n , x , inf);
add(x , i + n , 0);
add(i + n , y , inf);
add(y , i + n , 0);
sum += z;
}
/*
for (int i = 1 ; i <= E ; i ++) {
if (edge[i].z > 0) printf("%d %d %d\n" , edge[i].x , edge[i].y , edge[i].z);
}
cout << Isap() << endl;*/
printf("%d\n" , sum - Isap());
return 0;
}