這道題的難點在於將點拆分, 無向圖變為有向圖, 對於 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。也就是說割的容量...