LOJ 116 有源匯上下界最大流

2021-08-16 01:20:46 字數 1035 閱讀 6868

有源匯上下界最大流 模板題。具體講解見:

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 這麼多的流量,可以先建立一張每條流量...