zoukankan      html  css  js  c++  java
  • P1345[USACO5.4]奶牛的电信Telecowmunication

    题目描述

    农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流。这些机器用如下的方式发送电邮:如果存在一个由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不能互相通信需要坏掉的电脑数目的最小值。

    代码

    我只能说自己真是太native了,以为是割边,结果是割点

    拆点的思想,把一个点拆成出入两个点,中间连一条cap为1的边

    注意起点是s+n

    #include<bits/stdc++.h>
    #define inf 1<<30
    using namespace std;
    const int maxn=2000+10,maxm=20000+10;
    int head[maxn],vis[maxn];
    int size=1;
    int n,m,s,t;
    struct edge
    {
    	int to,next,cap;
    }e[maxm];
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    void addedge(int u,int v,int val)
    {
    	e[++size].to=v;e[size].cap=val;e[size].next=head[u];head[u]=size;
    	e[++size].to=u;e[size].cap=0;e[size].next=head[v];head[v]=size;
    }
    int dfs(int u,int f)
    {
    	if(u==t)return f;
    	vis[u]=1;
    	for(int i=head[u];i;i=e[i].next)
    	{
    		int to=e[i].to;
    		if(!vis[to]&&e[i].cap)
    		{
    			int d=dfs(to,min(f,e[i].cap));
    			if(d>0)
    			{
    				e[i].cap-=d;
    				e[i^1].cap+=d;
    				return d;
    			} 
    		}
    	}
    	return 0;
    }
    int maxflow()
    {
    	int flow=0;
    	while(1)
    	{
    		memset(vis,0,sizeof(vis));
    		int f=dfs(s+n,inf);
    		if(f==0)return flow;
    		flow+=f;
    	}
    }
    int main()
    {
    	n=read(),m=read(),s=read(),t=read();
    	for(int i=1;i<=n;i++)
    	addedge(i,i+n,1);
    	for(int i=1;i<=m;i++)
    	{
    		int u=read(),v=read();
            addedge(u+n,v,inf);
            addedge(v+n,u,inf);
    	}
    	printf("%d",maxflow()); 
    	return 0;
    }
    
  • 相关阅读:
    部署 AppGlobalResources 到 SharePoint 2010
    还原一个已删除的网站集
    使用仪表板设计器配置级联筛选器 (SharePoint Server 2010 SP1)
    File or arguments not valid for site template
    Pex and Moles Documentation
    Content Query Webpart匿名访问
    Running Moles using NUnit Console from Visual Studio
    Calling a WCF Service using jQuery in SharePoint the correct way
    Updating Content Types and Site Columns That Were Deployed as a Feature
    asp.net中判断传过来的字符串不为空的代码
  • 原文地址:https://www.cnblogs.com/DriverBen/p/10537608.html
Copyright © 2011-2022 走看看