最大权闭合子图模板题,这里就不提了,留个网络流的板板
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=60005;
vector<int> g[N];
struct lines{
int to,flow,cap;
}l[400005];
int num=-1,cur[N],d[N],n,m,S,T,tt;
bool v[N];
inline void add(int x,int y,int z){
l[++num]=(lines){y,0,z},g[x].pb(num);
l[++num]=(lines){x,0,0},g[y].pb(num);
}
inline bool bfs(){
queue<int> q;
memset(v,0,sizeof(v));
q.push(S),v[S]=1,d[S]=0;
for(int x;!q.empty();){
x=q.front(),q.pop();
for(int e:g[x]) if(l[e].flow<l[e].cap&&!v[l[e].to]){
v[l[e].to]=1,d[l[e].to]=d[x]+1;
q.push(l[e].to);
}
}
return v[T];
}
int dfs(int x,int A){
if(x==T||!A) return A;
int f,flow=0,sz=g[x].size();
for(int &i=cur[x];i<sz;i++){
lines &e=l[g[x][i]];
if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(A,e.cap-e.flow)))){
A-=f,flow+=f;
e.flow+=f,l[g[x][i]^1].flow-=f;
if(!A) break;
}
}
return flow;
}
inline int max_flow(){
int an=0;
while(bfs()){
memset(cur,0,sizeof(cur));
an+=dfs(S,1<<30);
}
return an;
}
inline void build(){
scanf("%d%d",&n,&m),T=n+m+1;
for(int i=1,val;i<=n;i++)
scanf("%d",&val),add(S,i,val);
for(int i=1,val,U,V;i<=m;i++){
scanf("%d%d%d",&U,&V,&val),tt+=val;
add(i+n,T,val),add(U,i+n,1<<30),add(V,i+n,1<<30);
}
}
int main(){
build();
printf("%d
",tt-max_flow());
return 0;
}