有源匯上下界最大流

2021-10-12 03:19:14 字數 1949 閱讀 3328

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的時候要去掉匯源邊,害得我白白地多花費了乙個小時。就離譜,這麼乙個網路流二次模板我寫了一下午。暈了。說回題目本身。建模是小事,主要是那個所謂的有源匯上下界最大流怎麼求。首先是無源匯上下界可行流怎麼搞?可以想到假如強制讓每一條邊流滿下界肯定是解題的...