# [NOI2006] 最大获利

最大权闭合子图模板题，这里就不提了，留个网络流的板板

#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++)

for(int i=1,val,U,V;i<=m;i++){
scanf("%d%d%d",&U,&V,&val),tt+=val;