傳送門:[usaco5.4]奶牛的電信
農夫約翰的奶牛們喜歡通過電郵保持聯絡,於是她們建立了乙個奶牛電腦網路,以便互相交流。這些機器用如下的方式傳送電郵:如果存在乙個由c臺電腦組成的序列a1,
a2,.
..,a
ca_1,a_2,...,a_c
a1,a2
,..
.,ac
,且a
1a_1
a1與a
2a_2
a2相連,a
2a_2
a2與a
3a_3
a3相連,等等,那麼電腦a
1a_1
a1和a
ca_c
ac就可以互發電郵。
很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。
有兩頭奶牛就想:如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。
以如下網路為例:
1 ∗/
3−2∗
1* / 3 - 2*
1∗/3−2
∗ 這張圖畫的是有2
22條連線的3
33臺電腦。我們想要在電腦1
11和2
22之間傳送資訊。電腦1
11與3
33、2
22與3
33直接連通。如果電腦3
33壞了,電腦1
11與2
22便不能互發資訊了。
簡化題意,本題求的是無向圖的最小割點。
直接求是不可能的,可以考慮將割點轉化成割邊,然後直接求最大流。
對於如下的點
直接拆成這樣
然後跑最大流就行了
對於s ,t
s, t
s,t,從s2s2
s2跑到t 1t1
t1
#include
#include
#include
#include
#define il inline
using
namespace std;
il int
read()
const
intinf
(0x3f3f3f3f);
int to[
3505
], nxt[
3505
], val[
3505];
int cnt, last[
505]
;il void
add(
int u,
int v,
int w)
int s, t;
int dis[
505]
, cur[
505]
;queue<
int>q;
il int
min_
(int x,
int y)
il bool
bfs()}
return0;
}il int
dfs(
int u,
int maxf)
return flow;
}il int
max_flow()
return flow;
}int
main()
for(
int i =
1, x, y; i <= m;
++i)
printf
("%d\n"
,max_flow()
);return0;
}
USACO5 4 奶牛的電信(最小割)
傳送門 最小割的點的數量 一般的最小邊求的是邊的權值和,這裡要求割掉的最少的點的數量。原本以為割掉的最少的邊的數量就是割掉的最少的點的數量。於是寫了個最小割跑,失敗了。後來看到沒有建雙向邊,於是建了但還是gg 錯誤之處在於這張圖 如果割點的話,我們只需要割掉紅色的點 如果割邊的話需要割掉兩條邊,這就...
USACO 奶牛電信
題目鏈結 洛谷1345 題目大意 給出乙個 n 個點 m條邊的無向圖,與 s,t 問至少刪去多少個點,使 s,t 不連通。n 100,m 600 分析 1.對於這種分離s,t 的題,考慮最大流 最小割的方法。2.然而題目要求割點,而不是割邊,怎麼辦?這就是一種經典的拆點題。3.把每個點 i 拆成兩個...
luogu1345 USACO5 4 奶牛的電信
一開始我是這樣想的 直接把所有邊的容量建成1然後最小割就是答案。因為最小割的定義就是割去容量和最小的邊使得s和t不連通,把所有邊的容量設為1,最小割不就是答案嗎?結果wa了。這道題是要歌曲最少的點,而我成了割去最少的邊。但我又考慮,乙個大小為1的流不正好對應應該去掉乙個點嗎?但是又一想,發現如下情況...