HDU 4289 Control(最大流 拆點)

2021-07-16 20:37:48 字數 1534 閱讀 3954

題意:乙個無向圖,點帶權值,有源點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),一開始想錯了

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define l(i) i<<1

#define r(i) i<<1|1

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define eps 1e-9

#define maxn 100100

#define mod 1000000007

const int maxn = 100010;

const int maxm = 400010;

struct edge

edge[maxm];

int tot,n,m;

int head[maxn];

int gap[maxn],dep[maxn];

int pre[maxn],cur[maxn];

void init()

void add_edge(int u,int v,int w,int rw = 0)

int sap(int start,int en,int n)

u = start;

ans += min;

continue;

}int flag = 0;

int v;

for(int i = cur[u]; i != -1; i = edge[i].next)

}if(flag)

int min = n;

for(int i = head[u]; i != -1; i = edge[i].next)

if(edge[i].cap - edge[i].flow && dep[edge[i].to] < min)

gap[dep[u]]--;

if(!gap[dep[u]])

return ans;

dep[u] = min + 1;

gap[dep[u]]++;

if(u != start)

u = edge[pre[u]^1].to;

}return ans;

}int main()

for(int i = 0; i < m; i++)

printf("%d\n",sap(2*st,2*ed+1,2*n));

}return 0;

}

HDU 4289 Control 最小割,拆點

計畫將 從城市 s 運輸到城市 d 現在我們知道 s 和 d 知道城市網路中存在的路徑 無向邊 知道封鎖每個城市各自需要的代價,我們可以對任意城市進行封鎖,到達被封鎖的城市就會被抓捕,求抓捕所有 需要的最小代價。顯然這是乙個最小割問題,但代價是點權而不是邊權,所以需要對每個城市結點拆成入點和出點,入...

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 ...