這是一道模板題。
\(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過程...