POJ 1273 Drainage Ditches(EK) - from lanshui_Yang
2013-08-29 10:27
344 查看
题目大意:每次下雨的时候,农场主John 的农场里就会形成一个池塘,这样就会淹没其中一个小块土地,在这块土地上种植了Bessie 最喜欢的植物。这意味着这些植物要被水淹没一段时间,而后要花很长时间才能重新长出来。因此,John 修建了一套排水系统,这样种植了这些植物的土地就不会被淹没。雨水被排到了附近的一条小河中。作为一个一流的工程师,John还在每条排水沟的起点安装了调节阀门,这样可以控制流入排水沟的水流的速度。
John不仅知道每条排水沟每分钟能排多少加仑的水,而且还知道整个排水系统的布局,
池塘里的水通过这个排水系统排到排水沟,并最终排到小河中,构成一个复杂的排水网络。
给定排水系统,计算池塘里能通过这个排水系统排水道小河中的最大水流速度。每条排水沟的流水方向是单方向的,但在排水系统中,流水可能构成循环。
解题思路:此题是一道基础的最大流。用EK直接水过。。。但要注意,输入中可能存在重边,要记得处理,还有,别忘了处理回流,HDU的题目数据较水(不处理回流也能过)。第一道网络流题目,纪念下。。。
请看代码:
John不仅知道每条排水沟每分钟能排多少加仑的水,而且还知道整个排水系统的布局,
池塘里的水通过这个排水系统排到排水沟,并最终排到小河中,构成一个复杂的排水网络。
给定排水系统,计算池塘里能通过这个排水系统排水道小河中的最大水流速度。每条排水沟的流水方向是单方向的,但在排水系统中,流水可能构成循环。
解题思路:此题是一道基础的最大流。用EK直接水过。。。但要注意,输入中可能存在重边,要记得处理,还有,别忘了处理回流,HDU的题目数据较水(不处理回流也能过)。第一道网络流题目,纪念下。。。
请看代码:
#include<iostream> #include<string> #include<algorithm> #include<cstring> #include<queue> #include<cmath> #include<cstdio> using namespace std ; const int MAXN = 205 ; inline void RD(int &a) { a = 0 ; char t ; do { t = getchar() ; } while (t < '0' || t > '9') ; a = t - '0' ; while ((t = getchar()) >= '0' && t <= '9') { a = a * 10 + t - '0' ; } } inline void OT(int a) { if(a >= 10) { OT(a / 10) ; } putchar(a % 10 + '0') ; } struct Edge { int c ; int f ; } e[MAXN][MAXN] ; bool vis[MAXN] ; int pre[MAXN] ; // 记录bfs后增广路中结点的前驱结点 const int INF = 0x7fffffff ; int m , n ; int s , t ; // 源点、汇点 int flow ; void init() { int i ; s = 1 ; t = n ; flow = 0 ; memset(e , 0 , sizeof(e)) ; memset(vis , 0 , sizeof(vis)) ; for(i = 0 ; i < m ; i ++) { int a , b , c ; scanf("%d%d%d" , &a , &b , &c) ; e[a][b].c += c ; // 处理重边 e[a][b].f = 0 ; } } queue<int> q ; void bfs(int u) { memset(vis , 0 , sizeof(vis)) ; memset(pre , -1 , sizeof(pre)) ; while (!q.empty()) q.pop() ; q.push(u) ; vis[u] = true ; int tmp ; while (!q.empty()) { tmp = q.front() ; q.pop() ; int i ; for(i = 1 ; i <= n ; i ++) { if(!vis[i] && e[tmp][i].c - e[tmp][i].f > 0 ) { vis[i] = true ; pre[i] = tmp ; if(i == t) return ; q.push(i) ; } } } } void solve() { flow = 0 ; while (1) { bfs(s) ; if(pre[t] == -1) break ; int delta = INF ; int tmp = t ; while (pre[tmp] != -1) { delta = min(e[ pre[tmp] ][tmp].c - e[ pre[tmp] ][tmp].f , delta) ; tmp = pre[tmp] ; } tmp = t ; while (pre[tmp] != -1) { e[ pre[tmp] ][tmp].f += delta ; e[tmp][ pre[tmp] ].f -= delta ; // 处理回流 tmp = pre[tmp] ; } flow += delta ; } printf("%d\n" , flow) ; } int main() { while (scanf("%d%d" , &m , &n) != EOF) { init() ; solve() ; } return 0 ; }
相关文章推荐
- POJ 3630 , HDU 1671 Phone List - from lanshui_Yang
- POJ 2533 Longest Ordered Subsequence - from lanshui_Yang
- POJ 2942 Knights of the Round Table - from lanshui_Yang
- poj 1273 EK 最大流
- POJ 1251 Jungle Roads(最小生成树水题) - from lanshui_Yang
- POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang
- POJ 2195 Going Home(KM)- from lanshui_Yang
- poj 1273 网络最大流(ek)
- POJ 2513 Colored Sticks - from lanshui_Yang
- POJ ~ 1273 ~ Drainage Ditches(Dinic和EK模板)
- POJ 2418 ,ZOJ 1899 Hardwood Species - from lanshui_Yang
- POJ 3177 Redundant Paths - from lanshui_Yang
- poj 1273 EK最大流入门题
- POJ 1904 King's Quest - from lanshui_Yang
- POJ 1469 COURSES (二分匹配) - from lanshui_Yang
- hdu 1532 POJ 1273 Drainage Ditches 和hdu 3549 Flow Problem 网络流入门(EK和dinic)
- POJ 1679 The Unique MST - from lanshui_Yang
- POJ 1094 Sorting It All Out (拓扑排序) - from lanshui_Yang
- poj1273 EK
- POJ 1828 Monkeys' Pride (易 TLE 题目) -- from lanshui_Yang