loj 115 無源匯有上下界可行流

2022-07-20 04:09:14 字數 1620 閱讀 3754

這是一道模板題。

\(n\) 個點,\(m\) 條邊,每條邊 \(e\) 有乙個流量下界 \(\text(e)\) 和流量上界 \(\text(e)\),求一種可行方案使得在所有點滿足流量平衡條件的前提下,所有邊滿足流量限制。

第一行兩個正整數 \(n\)、\(m\)。

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

如果無解,輸出一行no

否則第一行輸出yes,之後 \(m\) 行每行乙個整數,表示每條邊的流量。

4 6

1 2 1 2

2 3 1 2

3 4 1 2

4 1 1 2

1 3 1 2

4 2 1 2

4 61 2 1 3

2 3 1 3

3 4 1 3

4 1 1 3

1 3 1 3

4 2 1 3

no

yes123

211

1≤n≤200,1≤m≤10200

無源匯有上下界可行流判斷

無源匯是沒有s和t

有上下界是指每個邊的流量要在乙個\([l,r]\)內

可行流,指的是每條邊都要有乙個合法流,使得對於任意乙個點入流=出流

這個要怎麼求?

對於一條邊\(x\to y\),上下界為[l,r]

顯然如果成立,這條邊最少流l

把一條邊拆成兩條,一條容量為r-l, 一條容量為l,那麼容量為l的那條邊是一定要流滿的

我們建立乙個超級源s和超級匯t

對於\(x\to y\)

從x到y連容量為r-l的邊, 向y連容量為l的邊, x向t連容量為l的邊

即強制給yl的流,通過一些環(其它路徑)流到x

最後只需判斷s出去的邊的所有容量和與最大流是否相等即可

當且僅當所有l的邊都流滿了才有解,對於那些r-l的邊,隨便流多少,一定在範圍內的

最後實際上每條邊的流量就是r-l的邊的流量+l

#include#define ll long long

ll in()

const int maxn = 3e4 + 10;

struct node

void *operator new(size_t)

}*head[maxn], *cur[maxn];

int n, m, s, t, dep[maxn], ans[maxn], d[maxn];

void add(int from, int to, int c, int id)

void link(int from, int to, int c, int id)

bool bfs()

return dep[t];

}int dfs(int x, int change)

} return flow;

}int dinic()

int main()

if(tot == dinic())

else printf("no");

return 0;

}

loj 115 無源匯有上下界可行流

參考部落格 模型 乙個網路,求出乙個流,使得每條邊的流量必須 li且 hi,每個點必須滿足總流入量 總流出量 流量守恆 這個流的特點是迴圈往復,無始無終 這個演算法是有上下界網路流演算法的基礎,只要深刻理解這個演算法其他演算法也就水到渠成,因此我用大篇幅力圖將這個演算法的思想和細節闡述清楚.可行流演...

LOJ 115 無源匯有上下界可行流

模板題 首先把下界去掉 連邊upper lower 然後記錄每個點至少要流出的和流入的流量 下界 然後流入大於流出的連向tt,流出大於流入的連向ss 補流 然後跑最大流,如果sum flow,就代表加上的邊滿流,有答案,否則沒有 include include include include inc...

無源匯可行流 模板LOJ 115

自個設個源點s,匯點t,每個點 du i 入度 出度。du i 0時 加邊s i,邊權為du i du i 0時 加邊i t,邊權為 du i 設sum為所有 0的du i 的和 求s t的最大流,如果maxflow sum,則存在可行流,此時每條邊流掉的流量 它原本的下界就是實際的流量 dfs過程...