题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn = 100005; const int maxe = 500000; const int INF = 0x3f3f3f; struct Edge{ int v,flow,cap; int next; Edge(int v=0,int flow=0,int cap=0,int next=0): v(v) , flow(flow), cap(cap), next(next){} }; struct Dinic{ Edge edges[maxe]; int head[maxn],cnt; int cur[maxn]; int d[maxn]; int vis[maxn]; int s,t; void init(){ memset(head,-1,sizeof(head)); cnt = 0; } void addedge(int u,int v,int cap){ edges[cnt] = Edge(v,0,cap,head[u]); head[u] = cnt++; edges[cnt] = Edge(u,0,cap,head[v]); head[v] = cnt++; } bool bfs(){ memset(vis,0,sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = true; d[s] = 0; while(!Q.empty()){ int u = Q.front(); Q.pop(); for(int i=head[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(!vis[e.v] && e.cap > e.flow){ vis[e.v] = true; d[e.v] = d[u] + 1; Q.push(e.v); } } } return vis[t]; } int dfs(int u,int res){ if(u == t || res == 0) return res; int flow = 0,f; for(int& i=cur[u];i!=-1;i=edges[i].next){ Edge& e = edges[i]; if(d[e.v] == d[u] + 1 && (f = dfs(e.v,min(res,e.cap-e.flow))) > 0){ e.flow += f; edges[i^1].flow -= f; flow += f; res -= f; if(res == 0) break; } } return flow; } int MaxFlow(int s_,int t_){ s = s_; t = t_; int flow = 0; while(bfs()){ for(int i=0;i<=maxn;i++) cur[i] = head[i]; flow += dfs(s,INF); } return flow; } }solver; int main() { freopen("E:\acm\input.txt","r",stdin); int T; cin>>T; while(T--){ solver.init(); int N,M; cin>>N>>M; int maxx=-INF,minx=INF; int s,t; for(int i=1;i<=N;i++){ int x,y; scanf("%d %d",&x,&y); if(maxx < x){ maxx = x; t = i; } if(minx > x){ minx = x; s = i; } } for(int i=1;i<=M;i++){ int a,b,c; scanf("%d %d %d",&a,&b,&c); solver.addedge(a,b,c); } printf("%d ",solver.MaxFlow(s,t)); } }