Drainage Ditches |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 45 Accepted Submission(s): 38 |
Problem Description Every time it rains on Farmer John‘s fields, a pond forms over Bessie‘s favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie‘s clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch. |
Input The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch. |
Output For each case, output a single integer, the maximum rate at which water may emptied from the pond. |
Sample Input 5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10 |
Sample Output 50 |
Source USACO 93 |
题意:
裸的最大流
代码:
//紫书366页。模板。点的编号从0开始。 #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; const int maxn=202,inf=0x7fffffff; struct edge{ int from,to,cap,flow; edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){} }; struct Edmonds_Karp{ int n,m; vector<edge>edges;//边数的两倍 vector<int>g[maxn];//邻接表,g[i][j]表示节点i的第j条边在e数组中的序号 int a[maxn];//当起点到i的可改进量 int p[maxn];//最短路树上p的入弧编号 void init(int n){ for(int i=0;i<n;i++) g[i].clear(); edges.clear(); } void addedge(int from,int to,int cap){ edges.push_back(edge(from,to,cap,0)); edges.push_back(edge(to,from,0,0));//反向弧 m=edges.size(); g[from].push_back(m-2); g[to].push_back(m-1); } int Maxflow(int s,int t){ int flow=0; for(;;){ memset(a,0,sizeof(a)); queue<int>q; q.push(s); a[s]=inf; while(!q.empty()){ int x=q.front();q.pop(); for(int i=0;i<(int)g[x].size();i++){ edge&e=edges[g[x][i]]; if(!a[e.to]&&e.cap>e.flow){ p[e.to]=g[x][i]; a[e.to]=min(a[x],e.cap-e.flow); q.push(e.to); } } if(a[t]) break; } if(!a[t]) break; for(int u=t;u!=s;u=edges[p[u]].from){ edges[p[u]].flow+=a[t]; edges[p[u]^1].flow-=a[t]; } flow+=a[t]; } return flow; } }EK; int main() { int n,m,a,b,c; while(scanf("%d%d",&n,&m)==2){ EK.init(m); for(int i=0;i<n;i++){ scanf("%d%d%d",&a,&b,&c); a--;b--; EK.addedge(a,b,c); } printf("%d\n",EK.Maxflow(0,m-1)); } return 0; }