POJ1273 裸裸的网络流

北京好热啊,宿舍还没空调,都不能安安静静地敲代码了~>_<~今天老师讲网络流完全没听啊,晚上想了好久的网络流,感觉还是没有完全理解,过了一道模板题。

Drainage Ditches

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 61994   Accepted: 23794

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. 
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. 
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 int map[300][300];
 8 int pre[300];
 9 bool vis[300];
10 int n,m,s,t;
11 bool bfs()
12 {
13     int i,temp;
14     queue<int>q;
15     memset(pre,0,sizeof(pre));
16     memset(vis,0,sizeof(vis));
17     vis[s]=true;
18     q.push(s);
19     while(!q.empty())
20     {
21         temp=q.front();
22         q.pop();
23         if(temp==t) return true;
24         for(i=1;i<=n;i++)
25         {
26             if(!vis[i]&&map[temp][i])
27             {
28                 q.push(i);
29                 pre[i]=temp;
30                 vis[i]=true;
31             }
32         }
33     }
34     return false;
35 }
36 int EK()
37 {
38     int i,ans=0;
39     while(1)
40     {
41         if(!bfs()) return ans;
42         int MIN=9999999;
43         for(i=t;i!=s;i=pre[i])
44             MIN=min(MIN,map[pre[i]][i]);
45         for(i=t;i!=s;i=pre[i])
46         {
47             map[pre[i]][i]-=MIN;
48             map[i][pre[i]]+=MIN;
49         }
50         ans+=MIN;
51     }
52 }
53 int main()
54 {
55     while(~scanf("%d%d",&m,&n))
56     {
57         s=1,t=n;
58         memset(map,0,sizeof(map));
59         for(int i=0;i<m;i++)
60         {
61             int a,b,c;
62             scanf("%d%d%d",&a,&b,&c);
63             map[a][b]+=c;
64         }
65         printf("%d\n",EK());
66     }
67     return 0;
68 }

时间: 2024-10-13 17:47:50

POJ1273 裸裸的网络流的相关文章

【裸裸的左偏树】BZOJ1455-罗马游戏

[题目大意] 给出一些数和一些操作.M:合并两个数所在的集合,如果有任意一个数被删除则忽略操作:K:删除某个数所在集合中最小的数. [思路] 裸裸的,复习^ ^ 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1000000+500; 7 struct node 8

Lightoj 1231 - Coin Change (I) (裸裸的多重背包)

题目链接: Lightoj  1231 - Coin Change (I) 题目描述: 就是有n种硬币,每种硬币有两个属性(价值,数目).问用给定的硬币组成K面值,有多少种方案? 解题思路: 赤果果的多重背包,简单搞一下就好了.席八!烦烦烦.今天绝对是出门刷提前没看黄历,刚开始套了一个多重背包板子,蓝而跑出来的答案并不对,改来改去就错在细节的地方. 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4

裸裸的线段树(hdu 1754)

线段树的第一发. 哪天忘了还能够让自己找找回顾. 线段树操作: build  : 建树. update:点改动: query:查询 Input 在每一个測试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目. 学生ID编号分别从1编到N. 第二行包括N个整数,代表这N个学生的初始成绩,当中第i个数代表ID为i的学生的成绩. 接下来有M行.每一行有一个字符 C (仅仅取'Q'或'U') .和两个正整数A.B. 当C为'

POJ-1847 最短路裸题,Floyd, Bellman, Dijkstra, Spfa

POJ 1847 题意:n个点,电车从A到B.每个点可以到其它ki个点,但默认只通往给出的第一个点,如果要到其它点,必须改变轨道方向一次.问A到B最少改变几次轨道方向. 总结:裸裸的最短路,所以,狠狠的把Floyd, Bellman, Dijkstra, Spfa都给撸了一遍.一个字,爽! // POJ-1847 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<cstdl

[题解]poj 1274 The Perfect Stall(网络流)

二分匹配传送门[here] 原题传送门[here] 题意大概说一下,就是有N头牛和M个牛棚,每头牛愿意住在一些牛棚,求最大能够满足多少头牛的要求. 很明显就是一道裸裸的二分图最大匹配,但是为了练练网络流(做其它的题的时候,神奇地re掉了,于是就写基础题了)的最大流算法,就做做这道题. 每一个牛都可一看成是个源点,每一个牛棚都可以看成是个汇点,但是一个网络应该只有一个汇点和一个源点才对,于是构造一个连接每个牛的超级源点,一个连接每个牛棚的超级汇点,每条边的容量为1,然后最大流Dinic算法(其它最

hdoj 3549 Flow Problem(最大网络流)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 思路分析:该问题为裸的最大网络流问题,数据量不大,使用EdmondsKarp算法求解即可:需要注意的是该问题的点最多有15个,边的数目最多有1000个,所以该图中存在重边,需要将多个重边合为一条边: 代码如下: #include <queue> #include <vector> #include <cstdio> #include <climits> #

BZOJ 3876 【AHOI2014】 支线剧情

题目链接:支线剧情 这道题就是一道裸裸的上下界网络流--只不过这道题边带了权,那么建出图之后跑费用流即可. 首先需要新建超级源\(S\)和超级汇\(T\).对于这道题,对于一条边\((u,v,z)\),我们从\(S\)向\(v\)连一条容量为\(1\),费用为\(z\)的边,保证下界:从\(u\)向\(T\)连一条容量为\(1\),费用为\(0\)的边,也是用来保证下界的.由于没有上界,所以直接从\(u\)向\(v\)连一条容量为\(INF\),费用为\(z\)的边即可. 注意这道题可以在任意一

图论算法》关于最大流转最短路两三事

又要来一篇高质量的博客了 这道题可以用BZOJ1001做例子, 首先我们来张图 这张图有6个点,10条边,每条边都有边权. 那么什么叫最大流最小割捏? 解释如下 在一个平面图中,能够从其实点到达终点的最大流量,等于,如果从网络中移除就能够导致网络流中断的边的集合的最小容量和. 那么这个问题如何转变为最短路问题捏 再来一张图 这张图和上图的区别就在于,我们新建了两条边,一条是从作为起源点的1向无限左建边,一条是从作为终止点的6向无限右建边. 我们又新建了7个点分别为0到6,每个点的定义为被原来的边

Counting Divisors HDU - 6069

Counting Divisors HDU - 6069 题意:给定区间[a,b]和k,求xk有多少因子(x属于[a,b]),求和. 题解:http://blog.csdn.net/zlh_hhhh/article/details/76680641 a.b最大可达到1e12,但是b-a<1e6. 一开始愚蠢的一个一个分解然后去求有多少因子然后求和,范围那么大裸裸的超时啊! 可以枚举素数,对每一个素数,把区间内所有可以分解的进行分解. 最后再求和. 1 #include <bits/stdc++