很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。
有兩頭奶牛就想:如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。
以如下網路為例:
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不能互相通訊需要壞掉的電腦數目的最小值。
網路流的建邊永遠都是套路
而網路流的套路永遠都是建邊
把建邊一些,\(s、t\)賦個值
輕輕鬆鬆搞定。。。
這道題目很顯然,要求的是最小割。。。。
但是是點的最小割。。。
這就懵逼了。。。
怎麼辦呢?
當然是類似lct的加乙個點出來呀
然後把所有連出去的邊都連在這個點上面,
然後再從當前點連向這個點,
如果這個點要被割掉,那麼,這條邊就不走了。
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define maxl 50000
#define max 200
#define inf 1e8
inline int read()
struct line
e[maxl];
int h[max],cnt;
int n,m,s,t;
inline void add(int u,int v,int w)
; h[u]=cnt++;
}int level[max];
int cur[max];
bool bfs()
}return level[t];
}int dfs(int u,int flow)
}return ret;
}int dinic()
return ret;
}int main()
for(int i=1;i<=n;++i)
add(i,i+n,1),add(i+n,i,0);
cout
}
Luogu1345 奶牛的電信(網路流)
很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。有兩頭奶牛就想 如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。以如下網路為例 1 3 2 這張圖...
洛谷 P1345 奶牛的電信
題目描述 就是讓你求無向圖最小割點數 解析 把每個點分成兩個點,連一條距離為一的邊,再把任意兩個聯通的點之間連上正無窮大的邊,這樣求出來最小割一定是割流量為一的邊。特別注意的就是源點為出發點的出點,匯點為終點的入點,否則跑出來的值一定是一。程式 include include include inc...
luogu1345 USACO5 4 奶牛的電信
一開始我是這樣想的 直接把所有邊的容量建成1然後最小割就是答案。因為最小割的定義就是割去容量和最小的邊使得s和t不連通,把所有邊的容量設為1,最小割不就是答案嗎?結果wa了。這道題是要歌曲最少的點,而我成了割去最少的邊。但我又考慮,乙個大小為1的流不正好對應應該去掉乙個點嗎?但是又一想,發現如下情況...