有源匯上下界最大流 模板題。具體講解見:
sap演算法或dinic演算法跑出來的是殘量網路上,還能增加多少流量!
s->t 的最大流解法:
建立附加源匯ss,tt。(建法詳見上面的博文)
並建邊t->s,容量為正無窮。
跑一遍ss->tt最大流,若等於附加出邊容量和,即滿足下界滿流,則繼續求最大流,否則此題無解(無最大流)
此時,設sum1 = t->s 的最大流 (即t->s的反向邊的cap值)
將有附加源匯和t->s邊的新圖 恢復成 原始圖(但是容量cap不要恢復),再跑一遍s->t的最大流,記為sum2
。此題答案即為sum1+sum2
【**sap】
#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int n=220;
struct nodeedge[n*n];
int head[n],temp_h[n],cnt; //temp_h暫存head
void add(int s,int t,int cap)
; head[s]=cnt++;
edge[cnt]=; //反向邊便於反悔
head[t]=cnt++;
}int pre[n]; //前驅邊
int dep[n]; //節點的標號
int gap[n]; //gap[i]表示編號i出現的次數
int sap(int s,int t)
}if(i!=-1) //找到了允許弧edge[i]
flow=inf;}}
else //找不到允許弧
}}int bout[n],low[n*n*10];
int main()
add(t,s,inf);
if(sum==sap(ss,tt)) //下界邊滿流,並得
else printf("please go home to sleep\n");
}}
有源匯有上下界最大流詳解(loj116)
例題鏈結 首先吐槽一下放題人 我不知道是不是我理解錯了什麼。題目描述裡就乙個上下界然後就說要求最大流。直接建上界然後跑最大流不就完了麼?實際上原題是這樣的 求出乙個流使得源點的總流出量等於匯點的總流入量,其他的點滿足流量守恆,而且每條邊的流量滿足上界和下界限制。在這些前提下要求總流量最大。沒學過無源...
Loj 116 模板 有源匯有上下界最大流
n nn個點m mm條邊的一張圖,每條邊有流量上下限制,求源點到匯點的最大流。先別急著求上面那個,考慮一下怎麼求無源點匯點的上下界可行流。可以考慮先把下限流滿,這樣就會出現有的點流量不均衡的問題,考慮每個點除了下限以外還有附加流量,這些附加流量會最多佔能每條邊r l r lr l這麼多的流量,可以先...
Loj 116 模板 有源匯有上下界最大流
n 個點 m 條邊的一張圖,每條邊有流量上下限制,求源點到匯點的最大流。先別急著求上面那個,考慮一下怎麼求無源點匯點的上下界可行流。可以考慮先把下限流滿,這樣就會出現有的點流量不均衡的問題,考慮每個點除了下限以外還有附加流量,這些附加流量會最多佔能每條邊 r l 這麼多的流量,可以先建立一張每條流量...