****計畫將**從城市$s$運輸到城市$d$,現在我們知道$s$和$d$,知道城市網路中存在的路徑(無向邊),知道封鎖每個城市各自需要的代價,我們可以對任意城市進行封鎖,****到達被封鎖的城市就會被抓捕,求抓捕所有****需要的最小代價。
顯然這是乙個最小割問題,但代價是點權而不是邊權,所以需要對每個城市結點拆成入點和出點,入點向出點連邊,邊權為對應城市結點的點權,這樣就將點權代價轉換為邊權代價。不同城市之間的雙向路徑$(u,v)$,$u$的出點$u'$向$v$的入點$v$連邊,$v$的出點$v'$向$u$的入點$u$連邊,邊權為無窮大,表示其不能作為割邊。源點為$s$的入點,匯點為$d$的出點,跑最小割即可。
#include #includeview code#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;
}
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 ...