2 5 7 3 3 3 0 3 1 0 0 4 5 1 3 3 2 3 4 2 4 3 1 5 6 4 5 3 1 4 4 3 4 2 6 7 -1 -1 0 1 0 2 1 0 1 1 2 3 1 2 1 2 3 6 4 5 5 5 6 3 1 4 6 2 5 5 3 6 4
9 6
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int INF = ~0U>>2; 4 const int maxn = 100010; 5 struct arc{ 6 int to,flow,next; 7 arc(int x = 0,int y = 0,int z = -1){ 8 to = x; 9 flow = y; 10 next = z; 11 } 12 }e[2000100]; 13 int head[maxn],d[maxn],gap[maxn],tot,S,T,n,m; 14 void add(int u,int v,int flow){ 15 e[tot] = arc(v,flow,head[u]); 16 head[u] = tot++; 17 e[tot] = arc(u,flow,head[v]); 18 head[v] = tot++; 19 } 20 queue<int>q; 21 void bfs(){ 22 for(int i = 0; i <= n; ++i){ 23 d[i] = -1; 24 gap[i] = 0; 25 } 26 d[T] = 0; 27 q.push(T); 28 while(!q.empty()){ 29 int u = q.front(); 30 q.pop(); 31 ++gap[d[u]]; 32 for(int i = head[u]; ~i; i = e[i].next){ 33 if(d[e[i].to] == -1){ 34 d[e[i].to] = d[u] + 1; 35 q.push(e[i].to); 36 } 37 } 38 } 39 } 40 int dfs(int u,int low){ 41 if(u == T) return low; 42 int tmp = 0,minH = n - 1; 43 for(int i = head[u]; ~i; i = e[i].next){ 44 if(e[i].flow){ 45 if(d[e[i].to] + 1 == d[u]){ 46 int a = dfs(e[i].to,min(low,e[i].flow)); 47 e[i].flow -= a; 48 e[i^1].flow += a; 49 low -= a; 50 tmp += a; 51 if(!low) break; 52 if(d[S] >= n) return tmp; 53 } 54 if(e[i].flow) minH = min(minH,d[e[i].to]); 55 } 56 } 57 if(!tmp){ 58 if(--gap[d[u]] == 0) d[S] = n; 59 ++gap[d[u] = minH + 1]; 60 } 61 return tmp; 62 } 63 int main(){ 64 int kase,x,y,s,t,u,v,w; 65 scanf("%d",&kase); 66 while(kase--){ 67 scanf("%d%d",&n,&m); 68 memset(head,-1,sizeof head); 69 s = INF; 70 int ret = t = 0; 71 for(int i = 1; i <= n; ++i){ 72 scanf("%d%d",&x,&y); 73 if(s > x){ 74 s = x; 75 S = i; 76 } 77 if(t < x){ 78 t = x; 79 T = i; 80 } 81 } 82 for(int i = tot = 0; i < m; ++i){ 83 scanf("%d%d%d",&u,&v,&w); 84 add(u,v,w); 85 } 86 bfs(); 87 while(d[S] < n) ret += dfs(S,INF); 88 printf("%d\n",ret); 89 } 90 return 0; 91 }
原文:http://www.cnblogs.com/crackpotisback/p/4966546.html