标签:
Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 25832 | Accepted: 13481 |
Description
Input
Output
Sample Input
2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 (3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5 (0)5 (1)2 (3)2 (4)1 (5)4
Sample Output
15 6
Hint
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <stdio.h> 6 #include <queue> 7 #include <vector> 8 using namespace std; 9 const int MAX = 110; 10 const int INF = 0x3f3f3f3f; 11 struct Edge 12 { 13 int to,cap; 14 Edge(int v,int w):to(v),cap(w) {} 15 }; 16 int n,m,np,nc,s,t; 17 vector<int> g[MAX]; 18 vector<Edge> edge; 19 int d[MAX],cur[MAX]; 20 void AddEdge(int from,int to,int cap) 21 { 22 edge.push_back(Edge(to,cap)); 23 edge.push_back(Edge(from,0)); 24 int id = edge.size(); 25 g[from].push_back(id - 2); 26 g[to].push_back(id - 1); 27 28 } 29 bool bfs() 30 { 31 memset(d,0,sizeof(d)); 32 queue<int> q; 33 q.push(s); 34 d[s] = 1; 35 while(!q.empty()) 36 { 37 int x = q.front(); 38 q.pop(); 39 if(x == t) 40 return true; 41 int len = g[x].size(); 42 for(int i = 0; i < len; i++) 43 { 44 Edge e = edge[ g[x][i] ]; 45 if(d[e.to] == 0 && e.cap > 0) 46 { 47 d[e.to] = d[x] + 1; 48 q.push(e.to); 49 } 50 } 51 } 52 return false; 53 } 54 int dfs(int x, int a) 55 { 56 if(x == t || a == 0) 57 return a; 58 int flow = 0,f; 59 for(int& i = cur[x]; i < (int) g[x].size(); i++) 60 { 61 Edge& e = edge[ g[x][i] ]; //这里要是引用 62 if(d[x] + 1 == d[e.to] && (f = dfs(e.to,min(a,e.cap))) > 0) 63 { 64 e.cap -= f; 65 edge[ g[x][i] ^ 1].cap += f; 66 flow += f; 67 a -= f; 68 if(a == 0) 69 { 70 break; 71 } 72 } 73 } 74 return flow; 75 } 76 int MaxFlow() 77 { 78 int flow = 0; 79 while(bfs()) 80 { 81 memset(cur,0,sizeof(cur)); 82 flow += dfs(s,INF); 83 } 84 return flow; 85 } 86 int main() 87 { 88 char str[20]; 89 int u,v,w; 90 while(scanf("%d%d%d%d",&n,&np,&nc,&m) != EOF) 91 { 92 s = n + 1; 93 t = n + 2; 94 for(int i = 0; i < n + 2; i++) 95 g[i].clear(); 96 edge.clear(); 97 for(int i = 1; i <= m; i++) 98 { 99 scanf("%s",str); 100 sscanf(str,"%*c%d%*c%d%*c%d",&u,&v,&w); 101 AddEdge(u,v,w); 102 } 103 for(int i = 0; i < np; i++) 104 { 105 scanf("%s",str); 106 sscanf(str,"%*c%d%*c%d",&u,&w); 107 AddEdge(s,u,w); 108 } 109 for(int i = 0; i < nc; i++) 110 { 111 scanf("%s",str); 112 sscanf(str,"%*c%d%*c%d",&u,&w); 113 AddEdge(u,t,w); 114 } 115 printf("%d\n",MaxFlow()); 116 } 117 118 return 0; 119 }
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/5019765.html