洛谷1345 [Usaco5.4]奶牛的电信
題目描述
農夫約翰的奶牛們喜歡通過電郵保持聯系,于是她們建立了一個奶牛電腦網絡,以便互相交流。這些機器用如下的方式發送電郵:如果存在一個由c臺電腦組成的序列a1,a2,...,a(c),且a1與a2相連,a2與a3相連,等等,那么電腦a1和a(c)就可以互發電郵。
很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這臺倒霉的電腦就會壞掉。這意味著這臺電腦不能再發送電郵了,于是與這臺電腦相關的連接也就不可用了。
有兩頭奶牛就想:如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫一個程序為她們計算這個最小值。
以如下網絡為例:
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不能互相通信需要壞掉的電腦數目的最小值。
題解
直接粘貼洛谷的題解好了,翻了好多題解只看到這個講的比較清楚
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxn 505 #define inf 20000000 using namespace std; int n,m; int cnt=1,head[maxn]; int d[maxn]; int s,t,ans,ind; int team[maxn]; struct edge{int next,to,w; }e[5005]; void insert(int u,int v,int w){cnt++;e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=w;head[u]=cnt; } bool bfs() { int hea,tail;hea=tail=0;memset(d,0,sizeof(d));d[s]=1;team[++tail]=s;while(hea<tail){int x=team[++hea];for(int i=head[x];i;i=e[i].next)if(d[e[i].to]==0&&e[i].w!=0)d[e[i].to]=d[x]+1,team[++tail]=e[i].to;}if(d[t]==0) return false;return true; } int dfs(int x,int mmin) {if(x==t) return mmin;int tmp,f=0;for(int i=head[x];i;i=e[i].next)if(d[e[i].to]==d[x]+1&&e[i].w&&(tmp=dfs(e[i].to,min(mmin,e[i].w)))){e[i].w-=tmp,e[i^1].w+=tmp;f+=tmp,mmin-=tmp;if(mmin==0) return f;}return f; } int main(){scanf("%d%d%d%d",&n,&m,&s,&t);int u,v;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);insert(u+n,v,inf);insert(v+n,u,inf);insert(v,u+n,0);insert(u,v+n,0);}for(int i=1;i<=n;i++){insert(i,i+n,1);insert(i+n,i,0);}while(bfs()){ans+=dfs(s+n,inf);}printf("%d",ans);return 0; }
?
轉載于:https://www.cnblogs.com/Elfish/p/8067776.html
總結
以上是生活随笔為你收集整理的洛谷1345 [Usaco5.4]奶牛的电信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux监控服务并主动重启
- 下一篇: 非线性系统的线性化