網路流 最小割(例題 黑手幫)

2021-10-08 13:52:17 字數 1915 閱讀 4471

最小割

是乙個邊集,去掉其中的邊之後源點匯點無法再連通,且這個邊集的容量之和最小

最大流最小割定理

乙個網路中最大流量等於最小割中邊的容量之和,即最大流=

==最小割

而根據法二,容易得到最小割的求法

得到最大流後,沿殘量網路bfs,構建層次圖(走dfs建搜尋樹也行,反正把源點一邊打上標記就行了)

由於割去了路徑中最小的邊,這條邊會連線殘量網路能到達的點和不能到達的點

而這樣的邊就是割邊

網路流問題中容易出現邊點轉化問題

點拆成兩個點,中間一條邊體現點資訊

邊中間插個點,體現邊的資訊

最小割中邊權賦+

∞+\infin

+∞有防止割斷的含義

**幫

對於乙個點,u→u

+n

u\to u+n

u→u+

n,權值賦為點權

對於兩個點,要保證u→v

u\to v

u→v要消耗u

uu的邊權,於是u→v

u\to v

u→v邊權賦為0

00,u+n

→v

u+n\to v

u+n→

v邊權賦為∞

\infin

∞,這樣只能走u→u

+n→v

u\to u+n\to v

u→u+n→

v 艹這題資料太水了

我匯點都沒+n都有98pts ?

#include

using

namespace std;

#define in read()

int in

const

int inf=

2147483647

;const

int n=

4e2+5;

const

int m=

4e4+5;

int n,m,s,t;

int tot,first[n]

,nxt[m<<1]

,aim[m<<1]

,wei[m<<1]

;int d[n]

;bool vis[n]

;void

ljb(

int u,

int v,

int w)

bool

bfs()}

}return

false;}

intdinic

(int u,

int flow)

}return flow-rest;

}void

dfs(

int u)

return;}

intmain()

for(

int i=

1;i<=m;

++i)

while

(bfs()

)while

(dinic

(s,inf));

dfs(s)

; vector<

int>ans;

for(

int e=

1;e<=tot;e+=2

)sort

(ans.

begin()

,ans.

end())

;for

(int i=

0;isize()

;++i)

printf

("%d "

,ans[i]);

return0;

}

網路流 最小割

標籤 網路流 最小割 原題 洛谷p2057 善意的投票 題目描述 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋...

網路流 最小割

割是一種對網路流點的劃分方式 對於乙個網路流圖g v,e 劃分為s和t兩部分,其中t v s,源點s s,匯點t t 淨流f s,t 表示穿過割 s,t 的流量之和 f s,t f u,v u s,v t 割的容量c s,t 為所有從s到t的邊容量之和 c s,t c u,v u s,v t f s...

網路流之最小割

最小割的相關知識請參見 網路流問題 i.hdu4289 control 題意 給出乙個由n個點,m條邊組成的無向圖。給出兩個點s,t。對於圖中的每個點,去掉這個點都需要一定的花費。求至少多少花費才能使得s和t之間不連通。分析 題意即求最小割,將每個點拆點,點與對應點的邊權為去掉該點的花費,原圖中所有...