HDU 4289 Control 最小割,拆點

2022-05-21 10:24:11 字數 991 閱讀 3777

****計畫將**從城市$s$運輸到城市$d$,現在我們知道$s$和$d$,知道城市網路中存在的路徑(無向邊),知道封鎖每個城市各自需要的代價,我們可以對任意城市進行封鎖,****到達被封鎖的城市就會被抓捕,求抓捕所有****需要的最小代價。

顯然這是乙個最小割問題,但代價是點權而不是邊權,所以需要對每個城市結點拆成入點和出點,入點向出點連邊,邊權為對應城市結點的點權,這樣就將點權代價轉換為邊權代價。不同城市之間的雙向路徑$(u,v)$,$u$的出點$u'$向$v$的入點$v$連邊,$v$的出點$v'$向$u$的入點$u$連邊,邊權為無窮大,表示其不能作為割邊。源點為$s$的入點,匯點為$d$的出點,跑最小割即可。

#include #include 

#include

#include

using

std::queue;

const

int inf = 0x3f3f3f3f, n = 500, m = 100000

;int

head[n], d[n];

ints, t, tot, maxflow;

struct

edge

edge[m];

queue

q;void add(int x, int y, int

z) bool

bfs() }}

return

false;}

int dinic(int x, int

flow)

}return flow -rest;

}void

init()

intmain()

for (int i = 0, u, v; i < m; i++)

while (bfs()) maxflow +=dinic(s, inf);

printf(

"%d\n

", maxflow);

}return0;

}

view code

HDU 4289 Control(最大流 拆點)

題意 乙個無向圖,點帶權值,有源點s,匯點t,問最少拆出多少權值的點使st不連通 include s or t 可以轉化為最大流問題,將每個點p拆分成 p與p 使p p 邊權值賦為點權值,建邊 p,q 時只需連線 p q q p 邊權值為inf即可。跑最大流是sap 2 st,2 ed 1,2 n ...

hdu 4289 最大流拆點

大致題意 給出乙個又n個點,m條邊組成的無向圖。給出兩個點s,t。對於圖中的每個點,去掉這個點都需要一定的花費。求至少多少花費才能使得s和t之間不連通。大致思路 最基礎的拆點最大流,把每個點拆作兩個點 i 和 i 連線i i 費用為去掉這個點的花費,如果原圖中有一條邊a b則連線a b。對這個圖求出...

hdu 5017 模擬退火求最值

題意 給乙個橢圓 然後求原點到這個橢圓距離最小的點的距離是多少。解析 依舊用模擬退火。修改了乙個地方,初始溫度從100改到了1,就行了。之前的也修改了。選z的時候,選離遠點近的那個點就行了。pragma comment linker,stack 1677721600 include include ...