zoukankan      html  css  js  c++  java
  • spoj 1693 COCONUTS

    s向所有信仰1的人连(s,i,1),所有信仰0的人连(i,t,1),对于朋友关系,连接双向边,流量为1。跑最大流的结果即为答案。
    考虑这样做的意义。最小割就是把总点集分割为两个点集S,T,使得所有(uin S,vin T,val(u,v) )的值最小。也就是说,在这道题中的意义就是使最少的边两端相异(s代表选1,t代表选0,所以违背自己就是割掉与s或者t的边)。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=505,M=200005,inf=1e9;
    int n,m,s,t,le[N],h[N],cnt;
    struct qwe
    {
    	int ne,to,v;
    }e[M];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void add(int u,int v,int w)
    {
    	cnt++;
    	e[cnt].ne=h[u];
    	e[cnt].to=v;
    	e[cnt].v=w;
    	h[u]=cnt;
    }
    void ins(int u,int v,int w)
    {//cout<<u<<" "<<v<<endl;
    	add(u,v,w);
    	add(v,u,0);
    }
    bool bfs()
    {
    	memset(le,0,sizeof(le));
    	queue<int>q;
    	le[s]=1;
    	q.push(s);
    	while(!q.empty())
    	{
    		int u=q.front();
    		q.pop();
    		for(int i=h[u];i;i=e[i].ne)
    			if(!le[e[i].to]&&e[i].v>0)
    			{
    				le[e[i].to]=le[u]+1;
    				q.push(e[i].to);
    			}
    	}
    	return le[t];
    }
    int dfs(int u,int f)
    {
    	if(u==t||!f)
    		return f;
    	int us=0;
    	for(int i=h[u];i&&us<f;i=e[i].ne)
    		if(le[e[i].to]==le[u]+1&&e[i].v>0)
    		{
    			int t=dfs(e[i].to,min(e[i].v,f-us));
    			e[i].v-=t;
    			e[i^1].v+=t;
    			us+=t;
    		}
    	return us;
    }
    int dinic()
    {
    	int re=0;
    	while(bfs())
    		re+=dfs(s,inf);
    	return re;
    }
    int main()
    {
    	while(1)
    	{
    		memset(h,0,sizeof(h));
    		cnt=1;
    		n=read(),m=read();
    		if(!n)
    			break;
    		s=0,t=n+1;
    		for(int i=1;i<=n;i++)
    		{
    			int x=read();
    			if(x)
    				ins(s,i,1);
    			else
    				ins(i,t,1);
    		}
    		for(int i=1;i<=m;i++)
    		{
    			int x=read(),y=read();
    			add(x,y,1);
    			add(y,x,1);
    		}
    		printf("%d
    ",dinic());
    	}
    	return 0;
    }
    
  • 相关阅读:
    JS命名空间的使用
    PHPexcel的用法
    python爬取百度贴吧帖子
    python自动抢票
    int 与 String 与 char 之间的互相转换
    数据库备份和恢复
    Mysql 基础
    Mysql错误:Every derived table must have its own alias
    frameset框架集
    文件的上传(TCP)
  • 原文地址:https://www.cnblogs.com/lokiii/p/8403487.html
Copyright © 2011-2022 走看看