Drainage Ditches 草地排水 usaco 4.2.1
2012-05-30 19:35
375 查看
描述
在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。
根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
格式
PROGRAM NAME:ditchINPUT FORMAT:
(file ditch.in)
第1行: 两个用空格分开的整数N (0 <= N <= 200) 和 M (2 <= M <= 200)。N是农夫John已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。
第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。
OUTPUT FORMAT:
(file ditch.out)
输出一个整数,即排水的最大流量。
SAMPLE INPUT
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
SAMPLE OUTPUT
50 EK算法和dinic最大流。
/* ID:10239512 PROG:ditch LANG:C++ */ //#include <iostream> #include<fstream> #include<cstring> using namespace std; ifstream cin("ditch.in"); ofstream cout("ditch.out"); int n,m; int cf[201][201]={0}; int pre[201];int ans=0; int q[1000]; int main() { cin>>n>>m; for(int i=1;i<=n;++i) { int s,t,w; cin>>s>>t>>w; cf[s][t]+=w; } bool flag=1; q[1]=1; while(flag) { flag=0; memset(pre,0,sizeof(pre)); int h=0,t=1; while(h<t) { h++; for(int i=2;i<=m;++i) if(pre[i]==0&&cf[q[h]][i]>0) { pre[i]=q[h]; if(i==m) {flag=1;break;} q[++t]=i; } if(flag) break; } if(flag) { int v1=m; int mimi=0xffffff; while(v1!=1) { mimi=min(mimi,cf[pre[v1]][v1]); v1=pre[v1]; } v1=m; ans+=mimi; while(v1!=1) { cf[pre[v1]][v1]-=mimi; cf[v1][pre[v1]]+=mimi; v1=pre[v1]; } } } cout<<ans<<endl; return 0; }
/* ID:10239512 PROG:ditch LANG:C++ */ #include<fstream> #include<cstring> #define Max_int 0xffffff #define M 201 using namespace std; ifstream cin("ditch.in"); ofstream cout("ditch.out"); int n,m,s,t; int lin[M][M],cf[M][M],d[M],ans[M]; int Dinic(){ int q[M]; memset(q,0,sizeof(q)); for(int i=1;i<=m;++i) d[i]=Max_int; q[1]=s; d[s]=0; int len=1; for(int i=1;i<=len;++i) { int node=q[i]; for(int j=1;j<=ans[node];++j) { int next=lin[node][j]; if(cf[node][next]&&d[node]+1<d[next]) { q[++len]=next; d[next]=d[node]+1; if(next==t) return 1; } } } return 0; } int find(int num,int ccf){ if(ccf==0) return 0; if(num==t) return ccf; for(int i=1;i<=ans[num];++i) { int next=lin[num][i],sum=0; if(d[next]==d[num]+1&&(sum=find(next,min(ccf,cf[num][next])))) { cf[num][next]-=sum; cf[next][num]+=sum; return sum; } } return 0; } int main() { cin>>n>>m; s=1,t=m; for(int i=1;i<=n;++i) { int x,y,w;cin>>x>>y>>w; lin[x][++ans[x]]=y; cf[x][y]+=w; lin[y][++ans[y]]=x; } int tot=0,ccf=0; while(Dinic()) while(ccf=find(s,Max_int)) tot+=ccf; cout<<tot<<endl; return 0; }
相关文章推荐
- USACO Training 4.2.1 Drainage Ditches 草地排水 题解与分析<网络流DINIC算法>
- 【USACO4.2.1】草地排水 最大流
- 网络流Dinic(【USACO题库】4.2.1 Drainage Ditches草地排水 )
- 【USACO4.2.1】草地排水 网络流 最大流
- 网络流Sap+Gap(【USACO题库】4.2.1 Drainage Ditches草地排水 )
- 【USACO题库】4.2.1 Drainage Ditches草地排水
- USACO 4.2.1 草地排水 网络流
- 洛谷 P2740 [USACO4.2] 草地排水Drainage Ditches [Edmonds-Karp算法]
- 网络流的初步应用[USACO4.2]草地排水
- 洛谷 P2740 [USACO4.2] 草地排水Drainage Ditches [dinic算法]
- [USACO4.2]草地排水Drainage Ditches
- [USACO4.2]草地排水Drainage Ditches
- P2740 [USACO4.2]草地排水Drainage Ditches
- 【题解】洛谷P2740 poj1273 [USACO4.2]草地排水Drainage Ditches
- USACO草地排水
- CODEVS——T 1993 草地排水 USACO
- 洛谷P2740 [USACO4.2]草地排水Drainage Ditches
- USACO 4.2 Drainage Ditches 草地排水(预流推进)
- USACO 草地排水 网络流
- [USACO4.2]草地排水(网络流最大流模板)