網路流 最小割 洛谷P1345

2021-09-25 21:19:16 字數 1513 閱讀 5104

很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。

有兩頭奶牛就想:如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。

以如下網路為例:

1* / 3 - 2*

這張圖畫的是有2條連線的3臺電腦。我們想要在電腦1和2之間傳送資訊。電腦1與3、2與3直接連通。如果電腦3壞了,電腦1與2便不能互發資訊了。

輸入格式

第一行 四個由空格分隔的整數:n,m,c1,c2.n是電腦總數(1<=n<=100),電腦由1到n編號。m是電腦之間連線的總數(1<=m<=600)。最後的兩個整數c1和c2是上述兩頭奶牛使用的電腦編號。連線沒有重複且均為雙向的(即如果c1與c2相連,那麼c2與c1也相連)。兩台電腦之間至多有一條連線。電腦c1和c2不會直接相連。

第2到m+1行 接下來的m行中,每行包含兩台直接相連的電腦的編號。

輸出格式

乙個整數表示使電腦c1和c2不能互相通訊需要壞掉的電腦數目的最小值。

輸入輸出樣例

輸入 #1 複製

3 2 1 2

1 32 3

輸出 #1 複製

1解題思路:

首先這道題目是割點,但是我們可以把乙個點拆成兩個點,並且中間連線一條容量為1的有向邊,就把割點轉換成了割邊,題目要求我們去用最小的代價去是s 和 r不連通,即再這張圖上求其最小割。

構圖:上上面的基礎上,我們還需要把題目中給出的邊的邊權設定為inf,這樣就滿足了題目中每個點只能切割一次,而2個點之間的邊不能切割的要求。然後在這張圖上跑最大流就可以了。

注意:源點 : s = c1 + n, t = c2; 滿足流量守恆的原則

ac**:

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

const int n = 205, m = 3000;

const int inf = 0x3f3f3f3f;

int n, m, s, t, maxflow;

int h[n], w[m], e[m], ne[m], idx;

int d[n];

inline void add(int a, int b, int c)

inline bool bfs(void)

} }if(d[t] == 0) return false;

return true;

}inline int dinic(int u, int flow) else d[v] = 0;

} }return 0;

}int main(void)

int flow;

while(bfs())

while(flow = dinic(s, inf)) maxflow += flow;

printf("%d\n", maxflow);

return 0;

}

洛谷 P1345 奶牛的電信

題目描述 就是讓你求無向圖最小割點數 解析 把每個點分成兩個點,連一條距離為一的邊,再把任意兩個聯通的點之間連上正無窮大的邊,這樣求出來最小割一定是割流量為一的邊。特別注意的就是源點為出發點的出點,匯點為終點的入點,否則跑出來的值一定是一。程式 include include include inc...

洛谷 P2057 善意的投票(網路流最小割)

幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數。我們的...

洛谷1345 奶牛的電信 (最大流最小割)

洛谷1345 給出點的個數,邊的條數,源點和匯點。分別給出與邊相連的點,邊權為1。求最少刪去多少點使得源點和匯點不連通。題目是求刪點,最大流最小割演算法刪的是邊,所以要割點轉化為割邊 最大流最小割其實並不能算乙個演算法,只是將求最小割轉化為求最大流 將乙個點拆成兩個點,其中乙個點負責連線入邊,另外乙...