• 【BZOJ 1934】 [Shoi2007]Vote 善意的投票


    快算是BZOJ最水题了吧
    明显的最小割
    这样我还看题解 明明都(快)想出来了....
    下次 一定争取自己A上一道!!!!!!!!!!!!!
    Orz ws_fqk 刷的这么快!!

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdlib>
    using  namespace std;
    #define MAXN 550
    #define INF 100000000
    int n,m,s,t;
    int tot=2,g[MAXN],num[1000000],nnext[1000000],flow[1000000];
    int d[1000000],team[1000000],head,tail;
    void Add(int x,int y,int z){nnext[tot]=g[x];g[x]=tot;num[tot]=y,flow[tot]=z;tot++;}
    bool bfs()
    {
    	head=tail=0;memset(d,0,sizeof(d));
    	d[s]=1;team[++tail]=s;
    	while(head<tail)
    	{
    		int x=team[++head];
    		for(int i=g[x];i;i=nnext[i])
    		{
    			int tmp=num[i];
    			if(d[tmp]==0&&flow[i]!=0)
    				d[tmp]=d[x]+1,team[++tail]=tmp;
    		}
    	}
    	if(d[t]==0) return false;
    	return true;
    }
    int dfs(int x,int mmin)
    {
    	if(x==t) return mmin;
    	int f=0,tmp;
    	for(int i=g[x];i;i=nnext[i])
    		if(d[num[i]]==d[x]+1&&flow[i]!=0&&(tmp=dfs(num[i],min(mmin,flow[i]))))
    		{
    			flow[i]-=tmp;
    			flow[i^1]+=tmp;
    			f+=tmp,mmin-=tmp;
    			if(mmin==0) return f;
    		}
    	return f;
    }
    
    int main()
    {
    	scanf("%d %d",&n,&m);s=n+1,t=n+2;
    	for(int i=1,tmp;i<=n;i++)
    	{
    		scanf("%d",&tmp);
    		if(tmp==1) Add(s,i,1),Add(i,s,0);
    		else Add(i,t,1),Add(t,i,0);
    	}
    	for(int x,y,i=1;i<=m;i++)
    	{
    		scanf("%d %d",&x,&y);
    		Add(x,y,1);
    		Add(y,x,1);
    	}
    	int ans=0;
    	while(bfs()) ans+=dfs(s,INF);
    	printf("%d\n",ans);
    	return 0;
    }
    
  • 相关阅读:
    安装IDEA
    缓存工具CacheUtil
    使用Eclipse上传/下载Git项目
    Sublime文本排序&查找重复行&删除重复行
    Sublime Text 3 配置Java开发
    安装XMind
    安装Maven
    安装MySQL
    安装Eclipse及相关Plugin
    Android Xposed框架中创建模块的指导手册
  • 原文地址:https://www.cnblogs.com/ofsxb/p/5110400.html
Copyright © 2020-2023  润新知