a - 有源匯有上下界最大流
/*libreoj - 116
給定乙個包含 n 個點 m
條邊的有向圖,每條邊都有乙個流量下界和流量上界。
給定源點 s和匯點 t,求源點到匯點的最大流。
輸入格式
第一行包含四個整數 n,m,s,t。
接下來 m行,每行包含四個整數 a,b,c,d 表示點 a 和 b 之間存在一條有向邊,該邊的流量下界為 c,流量上界為 d。點編號從 1
到 n。
輸出格式輸出乙個整數表示最大流。
如果無解,則輸出 no solution。
資料範圍1≤n≤202,1≤m≤9999,1≤a,b≤n,0≤c≤d≤105
輸入樣例:
10 15 9 10輸出樣例: 思路:9 1 17 18
9 2 12 13
9 3 11 12
1 5 3 4
1 6 6 7
1 7 7 8
2 5 9 10
2 6 2 3
2 7 0 1
3 5 3 4
3 6 1 2
3 7 6 7
5 10 16 17
6 10 10 11
7 10 14 15
1,如果該圖存在最大流那麼一定存在最低流量的一種可行流(即恰好使圖中有s到t的有可行流),我們姑且將這個稱為基礎流
2,對整個圖來說,倘若有可行流那麼一定是在基礎流上面增加流量
3,對於有源匯有上下界最大流,先用有源匯有上下界可行流的方法,找到乙個最小的解,此時這個圖上的流量加流量下界,就是基礎流
4,然後只需在3的基礎流上面跑最大流,即可把流量榨乾,得到最大流。
具體**細節如下
*/
#include
#include
#include
#include
using
namespace std;
const
int n =
210, m =
(n +
10000)*
2, inf =
1e8;
int n, m, s, t;
int e[m]
, f[m]
, ne[m]
, h[n]
, idx;
int q[n]
, cur[n]
, d[n]
, a[n]
;void
add(
int a,
int b,
int c)
bool
bfs()}
}return
false;}
intfind
(int u,
int limit)
}return flow;
}int
dinic()
intmain()
int tot =0;
for(
int i =
1; i <= n; i++)if
(a[i]
>0)
add(s, i, a[i]
), tot +
= a[i]
;//點與點之間的流入流出不平衡的局面營造出來
else
if(a[i]
<0)
add(i, t,
-a[i]);
add(t, s, inf);if
(dinic()
< tot)
puts
("please go home to sleep");
else
return0;
}
有源匯上下界最大流
題目描述 這是一道模板題。n n n 個點,m m m 條邊,每條邊 e e e 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s s s 與匯點 t t t,求源點到匯點的最大流。輸入格式 第一行兩個正整數 n n...
有源匯的上下界最大流
主要由兩種做法 1 二分乙個流量,然後跑乙個最大流,看有沒有能滿足的可行流,能滿足的流量的最大值就是答案了,複雜度 單次網路流複雜度 log最大流量 反之我是不想寫這個的,感覺寫起很麻煩,而且二分的邊界也不好調 看方法二就可以了 2 首先無論如何我們都需要先跑一次可行流的 不然連能不能流通都不知道 ...
模板 有源匯上下界最大流
link 媽的 題解話不說清楚,不早說第二輪dinic的時候要去掉匯源邊,害得我白白地多花費了乙個小時。就離譜,這麼乙個網路流二次模板我寫了一下午。暈了。說回題目本身。建模是小事,主要是那個所謂的有源匯上下界最大流怎麼求。首先是無源匯上下界可行流怎麼搞?可以想到假如強制讓每一條邊流滿下界肯定是解題的...