codevs 1993草地排水

2022-04-02 18:53:53 字數 1863 閱讀 1086

農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局(起點為水潭而終點為小溪的一張網)。需要注意的是,有些時候從一處到另一處不只有一條排水溝。

根據這些資訊,計算從水潭排水到小溪的最大流量。對於給出的每條排水溝,雨水只能沿著乙個方向流動,注意可能會出現雨水環形流動的情形。

輸入描述 input description

第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 description

輸出乙個整數,即排水的最大流量。

樣例輸入 sample input

5 4

1 2 40

1 4 20

2 4 20

2 3 30

3 4 10

樣例輸出 sample output

這是一道最大流的經典題

最大流盡量應該用邊表,優於鄰接矩陣(所以我寫了鄰接矩陣版的之後又寫了個邊表)

用了新學的dinic演算法

在每次找增廣路之前先跑一遍bfs,把所有點的深度標記,按bfs記下的順序找增廣路,這條增廣路上最小的邊容量就是這條增廣路的最大費用

跑出一條增廣路之後,就開始更新現在的邊剩餘的容量,並建立反向邊。

#include#include

#include

#include

using

namespace

std;

int n,m,map[300][300],ans,pre[300

];void flow(int s,int

t) }

if(pre[t]==0)break

;

int so=0x7fffffff

;

for(int i=t;i!=s;i=pre[i])ans+=so;

for(int i=t;i!=s;i=pre[i])

}}int

main()

ans=0

; flow(

1,n);

printf(

"%d\n

",ans);}}

鄰接矩陣

#include#include

#include

#include

using

namespace

std;

#define inf 100000000

struct

nodee[

300];

int ans,n,m,num=1,head[300

];void add(int

from,int to,int

v)int dep[300],road[300

],num;

bool

bfs()}}

return

false;}

int dinic(int s,int

f) }

return f-rest;

}int

main()

while

(bfs())

ans+=dinic(1

,inf);

printf("%d

",ans);

}

邊表

CODEVS 1993 草地排水

題目描述 description 農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局 起點為水潭而終點為小溪的一張網 需要注意的是,有些時候從一處到另一處不只有一條排水溝。根據這些資訊,計算從水潭排水到小溪的最大流量。對於給出的每條排水溝,雨水只能沿著乙個方向流動,注意可能會出現雨水...

codevs1993 草地排水(最大流)

usaco 時間限制 2 s 空間限制 256000 kb 題目等級 鑽石 diamond 農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局 起點為水潭而終點為小溪的一張網 需要注意的是,有些時候從一處到另一處不只有一條排水溝。根據這些資訊,計算從水潭排水到小溪的最大流量。對於給出...

codevs1993 草地排水(最大流)

最近學了最大流,於是去codevs找了幾道最大流裸題 這是我第一次寫網路流 題目大意 求乙個圖的最大流 就是這樣的裸題 第一次a網路流的題,發個部落格紀念一下。var n,m,i,j,k,h,t,x,y,z,ans longint a array 0.410,0.410 of longint q,l...