USACO5 4 奶牛的電信

2021-08-28 19:14:01 字數 2045 閱讀 3748

傳送門:[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的流不正好對應應該去掉乙個點嗎?但是又一想,發現如下情況...