有源匯上下界最大流

2022-06-27 03:03:13 字數 1673 閱讀 1137

題目描述

這是一道模板題。

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 n、m m m、s s s、t t t。

之後的 m m m 行,每行四個整數 s s s、t t t、lower \text lower、upper \text upper。

輸出格式

如果無解,輸出一行 please go home to sleep。

否則輸出最大流。

樣例樣例輸入

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

樣例輸出

43資料範圍與提示

**示例 :

using namespace std;

#define ll long long

const int maxn = 1e5+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

int n, m, s, t;

struct node

e[maxn];

int head[maxn];

int cnt = 0;

void addedge(int u, int v, int w)

int dep[300];

int que[maxn];

bool bfs(int s, int t)}}

return dep[t];

}int aim;

int dfs(int u, int f1)

}if (!f) dep[u] = -2;

return f;

}int dinic(int s, int t)

return res;

}int main()

int flow = dinic(ss, tt);

int ans = e[1].flow;

//printf("ans = %d %d %d\n", ans, sum, e[1].flow);

if (flow != sum)

e[0].flow = 0, e[1].flow = 0;

ans += dinic(s, t);

printf("%d\n", ans);

return 0;

}

有源匯上下界最大流

a 有源匯有上下界最大流 libreoj 116 給定乙個包含 n 個點 m 條邊的有向圖,每條邊都有乙個流量下界和流量上界。給定源點 s和匯點 t,求源點到匯點的最大流。輸入格式 第一行包含四個整數 n,m,s,t。接下來 m行,每行包含四個整數 a,b,c,d 表示點 a 和 b 之間存在一條有...

有源匯的上下界最大流

主要由兩種做法 1 二分乙個流量,然後跑乙個最大流,看有沒有能滿足的可行流,能滿足的流量的最大值就是答案了,複雜度 單次網路流複雜度 log最大流量 反之我是不想寫這個的,感覺寫起很麻煩,而且二分的邊界也不好調 看方法二就可以了 2 首先無論如何我們都需要先跑一次可行流的 不然連能不能流通都不知道 ...

模板 有源匯上下界最大流

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