codevs1993 草地排水
来源:互联网 发布:源码下载yuansms 编辑:程序博客网 时间:2024/04/25 20:45
在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。
农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。
根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
第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)是这条排水沟的最大容量。
输出一个整数,即排水的最大流量。
5 41 2 401 4 202 4 202 3 303 4 10
50
由于数据弱,用没有优化的EK就可以过去了。
通过这个题,我弄明白了“建立反向边”的作用。之前看其他资料说“建立反向边就是给程序反悔的机会”,但始终不得要领。通过这个题,终于将其弄明白。
如这组数据:
7 6
1 2 10000
2 3 10000
3 6 10000
1 4 8000
4 3 8000
2 5 6000
5 6 6000
如图所示:
如果直接执行bfs后选择的可增广路有可能是1,2,3,6,如果没有反向边,那么就会将1,2,3,6的容量直接减为0,然后就得到了答案10000.但是实际上答案是16000,这就是退流的作用。那么,16000的流量从1开始,8000:1,4,3,6;2000:1,2,3,6;6000:1,2,5,6.所以第一次选择1,2,3,6之后,建立反向边后如图:
如此就可以再反向边上进行退流,即“给程序反悔的机会”。
如此,执行没有任何优化的EK这个题就可以过了。
#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<vector>#define min(a,b) ((a<b)? a:b)using namespace std;long n,m;struct qianxiangxing{long shangyige,xiayige,rongliang; long next;} t[1000];long dian[1000];long lu[1000];queue<long> q;bool spfa(long s,long v){long juli[1000]; bool y[1000],yy=false; long h,i,j; memset(juli,0x7f,sizeof(juli)); memset(y,0,sizeof(y)); memset(lu,0,sizeof(lu)); q.push(s); juli[s]=0; y[s]=true; while(!q.empty()){h=q.front(); q.pop(); if(h==v){yy=true; break;} i=dian[h]; while(i!=0){if((juli[t[i].xiayige]>juli[h]+1)&&(t[i].rongliang>0)) {juli[t[i].xiayige]=juli[h]+1; if(y[t[i].xiayige]!=true){q.push(t[i].xiayige); y[t[i].xiayige]=true;} lu[t[i].xiayige]=i;} i=t[i].next;} y[h]=true;} while(!q.empty()) q.pop(); return yy;}long EK(long s,long v){long zuida=0,i; long e=0x7fffffff; while(spfa(s,v)) {i=v; e=0x7fffffff; while(i!=s){i=lu[i]; e=min(e,t[i].rongliang); i=t[i].shangyige;} i=v; while(i!=s){i=lu[i]; t[i].rongliang-=e; if(t[i].shangyige==t[i+1].shangyige&&t[i].xiayige==t[i+1].xiayige) t[i+1].rongliang+=e; else t[i-1].rongliang+=e; i=t[i].shangyige;} zuida+=e;} return zuida;}int main(){cin>>m>>n; long a,b,c,d=0; for(long i=1;i<=m;i++){cin>>a>>b>>c; d++;t[d].shangyige=a;t[d].xiayige=b;t[d].rongliang=c;if(dian[a]==0){dian[a]=d; lu[a]=d;}else{t[lu[a]].next=d; lu[a]=d;}d++;t[d].shangyige=b;t[d].xiayige=a;t[d].rongliang=0;if(dian[b]==0){dian[b]=d; lu[b]=d;}else{t[lu[b]].next=d; lu[b]=d;}} memset(lu,0,sizeof(lu)); cout<<EK(1,n)<<endl; return 0;}
- codevs1993 草地排水
- Codevs1993草地排水
- 【CODEVS1993】【网络流】草地排水
- 【codevs1993】草地排水(isap)
- [codevs1993]草地排水(最大流裸题)
- 【codevs1993】草地排水,网络流入门(dinic+ispa)
- codevs1993草地排水——第一次写网络流
- 草地排水
- 【Drainage Ditches 草地排水】
- 【wikioi1993】草地排水
- 【wikioi1993】 草地排水
- USACO草地排水
- code vs 草地排水
- [codevs 1993]草地排水
- Codevs 1993 草地排水
- codevs 1993草地排水
- 问题 A: 草地排水
- USACO 草地排水 网络流
- 不用任何循环语句和判断句实现1-100的和
- Python图像处理(12):贝叶斯分类器
- 常规的利用Curl发送json数据到后台SpringBoot+MongoDB测试CRUD
- html 自定义ScrollBar
- hive常用命令
- codevs1993 草地排水
- Hough变换检测直线
- Linked List Cycle
- 获取手机型号、系统版本号、APP版本号信息(常用语全局异常处理中收集错误信息)
- JAVA中的内部类--匿名内部类
- SDL 配置
- 第六章 语句
- 不用+,-,*,/求两个数的和
- ffmpeg 0.8.7在windows环境mingw环境的编译