農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局(起點為水潭而終點為小溪的一張網)。需要注意的是,有些時候從一處到另一處不只有一條排水溝。
根據這些資訊,計算從水潭排水到小溪的最大流量。對於給出的每條排水溝,雨水只能沿著乙個方向流動,注意可能會出現雨水環形流動的情形。
輸入描述 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樣例輸出 sample output1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
這是一道最大流的經典題
最大流盡量應該用邊表,優於鄰接矩陣(所以我寫了鄰接矩陣版的之後又寫了個邊表)
用了新學的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...