您的位置:首页 > 大数据 > 人工智能

POJ 1273 -Drainage Ditches

2015-06-07 22:06 417 查看
Time Limit:1000MS Memory Limit:10000K

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.

每次下雨的时候,农场主John的农场里就会形成一个池塘,这样就会淹没其中一小块土地,在这块土地上种植了Bessie最喜欢的苜蓿。这意味着苜蓿要被水淹没一段时间,而后要花很长时间才能重新长出来。因此,John修建了一套排水系统,这样种植了苜蓿的土地就不会被淹没。雨水被排到了附近的一条小河中。作为一个一流的工程师,John还在每条排水沟的起点安装了调节阀门,这样可以控制流入排水沟的水流的速度。

John不仅知道每条排水沟每分钟能排多少加仑的水,而且还知道整个排水系统的布局,池塘里的水通过这个排水系统排到排水沟,并最终排到小何中,构成一个复杂的排水网络。

给定排水系统,计算池塘能通过这个排水系统排水到小河中的最大水流速度。每条排水沟的流水方向是单方向的,但在排水系统中,流水可能构成循环。

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.

输入文件中包含多个测试数据。每个测试数据的第1行为两个整数M和N,用空格隔开。0≤M≤200,2≤N≤200,其中M是排水沟的数目,N是这些排水沟形成的汇合结点数目。结点1为池塘,结点N为小河。接下来有M行,每行描述了一条排水沟,用三个整数来描述:Si,Ei和Ci,其中Si和Ei(1≤Si,Ei≤N)标明了这条排水沟的起点和终点,水流从Si流向Ei,Ci(0≤Ci≤10 000 000)表示通过这条排水沟的最大流水速度。

[b]Output[/b]

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


[b]Source[/b]

USACO 93

然而这道题目就是赤裸裸的求容量网络中的最大流...

代码:

var
c,e,n,m,i,s,t:longint;
ans,inf:int64;
h,d,f,g:array[0..5000]of longint;
ot,cap,ne:array[0..100000]of longint;

procedure addedge(x,y,z:longint);
begin
ot[e]:=y; ne[e]:=g[x]; cap[e]:=z; g[x]:=e; inc(e);
ot[e]:=x; ne[e]:=g[y]; cap[e]:=0; g[y]:=e; inc(e);
end;

function min(a,b:int64):int64;
begin
if a<b then exit(a)
else exit(b);
end;

function bfs:boolean;
var
l,r,x,p:int64;
begin
for i:=1 to n do d[i]:=n+10;
l:=0; r:=1; h[1]:=s; d[s]:=0;
while l<r do
begin
inc(l);
p:=g[h[l]];
while p<>-1 do
begin
if (cap[p]<>0)and(d[ot[p]]>d[h[l]]+1) then
begin
inc(r);
h[r]:=ot[p];
d[ot[p]]:=d[h[l]]+1;
end;
p:=ne[p];
end;
end;
exit(d[t]<>n+10);
end;

function dfs(x,flow:int64):int64;
var
p,tmp:int64;
begin
if x=t then exit(flow);
p:=f[x]; dfs:=0;
while (p<>-1)and(dfs<flow) do
begin
if (cap[p]<>0)and(d[ot[p]]=d[x]+1) then
begin
tmp:=dfs(ot[p],min(flow-dfs,cap[p]));
dec(cap[p],tmp);
inc(cap[p xor 1],tmp);
inc(dfs,tmp);
end;
p:=ne[p];
end;
f[x]:=p;
end;

begin
inf:=high(int64);
while not eof do begin
readln(m,n);
e:=0;
fillchar(g,sizeof(g),255);
for i:=1 to m do
begin
readln(s,t,c);
addedge(s,t,c);
end;
s:=1; t:=n; ans:=0;
while bfs do
begin
for i:=1 to n do
f[i]:=g[i];
inc(ans,dfs(s,inf));
end;
writeln(ans); end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: