USACO 5 4 3 點的最小割

2022-03-21 02:57:33 字數 1624 閱讀 2037

這道題的難點在於將點拆分, 無向圖變為有向圖, 對於 i點我們可以將這個點拆分成2*i-1 -> 2*i,權值為1 對於i - j, 我們可以將點拆分以後再新增2*j -> 2*i-1 2*i -> 2*j-1,權值為inf,  然後求解最大流即為要去掉的頂點的個數, 求解具體的邊的時候我們可以列舉要刪除的邊, 假設刪除前的最大流為f,邊權為1, 刪除邊後的最大流為ff, 若ff+1 == f的話那麼這條邊就在最小割集中。然後更新最大流,刪掉最這條邊重複上述操作即可, **如下:

/*

id: m1500293

lang: c++

prog: telecow

*/#include

#include

#include

#include

using

namespace

std;

const

int maxn = 250

;int inf = 0x3f3f3f3f

;struct

dinic

; vector

g[maxn];

vector

e;

intlevel[maxn], iter[maxn];

void

init()

void add_edge(int u, int v, int

cap)

);e.push_back((edge));

int m =e.size();

g[u].push_back(m-2

); g[v].push_back(m-1

); }

void bfs(int

s) }}

}int dfs(int v, int t, int

f) }}

return0;

}int max_flow(int s, int

t)

}}aa, bb;

bool cmp(const

int &a, const

int &b)

int ans[200

], nans;

intmain()

for(int i=1; i<=n; i++)

aa.add_edge(

2*i-1, 2*i, 1

);

//printf("%d\n", aa.max_flow(2*c1, 2*c2-1));

bb =aa;

int f = bb.max_flow(2*c1, 2*c2-1

);

int ans1 =f;

nans = 0

;

for(int i=0; iif(aa.e[i].cap == 1

)

}sort(ans, ans+nans, cmp);

printf(

"%d\n

", ans1);

for(int i=0; i)

printf(

"%d%c

", ans[i], i==nans-1?'

\n':'');

return0;

}

USACO5 4 奶牛的電信(最小割)

傳送門 最小割的點的數量 一般的最小邊求的是邊的權值和,這裡要求割掉的最少的點的數量。原本以為割掉的最少的邊的數量就是割掉的最少的點的數量。於是寫了個最小割跑,失敗了。後來看到沒有建雙向邊,於是建了但還是gg 錯誤之處在於這張圖 如果割點的話,我們只需要割掉紅色的點 如果割邊的話需要割掉兩條邊,這就...

poj Friendship 最小割 拆點

題意 在乙個關係網中,如果說a與b保持聯絡,那麼a應該知道b的 號碼。或者存在c,a知道c的 號碼,c知道b的 號碼。可以認為如果a知道b的 號碼,那麼b也知道a的 號碼。在乙個關係網中可能會出現一些意外事故,比如某人更換手機號碼了,導致他與其他人都失去了聯絡。問給定兩個人s和t,問,最少多少人出現...

最小割的一點理解

一 基本問題 1.到底什麼是割 原始點集為v,選出一些點集s使得s s,t v s,t t,則s到t的邊為s到t割,記做 s,t 2.什麼是最小割 圖中所有的割中,邊權值和最小的割為最小割!3.割得容量容量和流量計算的區別 割 s,t 的容量為 邊 u,v 的容量和 其中u s,t。也就是說割的容量...