• 【BZOJ4155】[Ipsc2015]Humble Captains 最小割+DP


    【BZOJ4155】[Ipsc2015]Humble Captains

    Description

    每天下午放学时都有n个zky冲出教室去搞基。搞基的zky们分成两队,编号为1的zky是1号队的首领,编号为2的zky是2号队的首领。其他的zky可以自由选择是去1队还是2队。
    zky们当中有几对zky是好基友(同一个zky可能在多对“好基友”关系中),如果一对好基友在同一个队,那么这个队的战斗力就+1。
    现在你要解决两个问题:1.两队战斗力之和最大是多少?2.两队战斗力之差的绝对值最小是多少?
    注意:这两个问题是不相关的。也就是说,问1和问2的方案可以是不一样的。

    Input

    第一行t表示数据组数
    每一组测试数据的第一行包含两个整数n,m,zky们编号从1到n,共有m对好基友关系。
    接下来m行每行两个整数u和v,表示u和v之间存在好基友关系。保证每一对好基友关系只会被描述一次。

    Output

    对每一组,输出一行两个数,第一个是最大战斗力之和,第二个是最小战斗力之差。

    Sample Input

    2
    3 3
    1 2
    2 3
    1 3

    3 1
    1 3

    Sample Output

    1 1
    1 0

    HINT

    n <= 200, t <= 250

    题解:第一问不会的去练最小割,第二问不会的去做阿狸和桃子的游戏。

    然而本题第二问求的是差最小,那么把贪心换成 搭建双塔 即可。

    但是复杂度有点高,用bitset优化即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <queue>
    #include <bitset>
    using namespace std;
    int n,m,T,cnt,ans;
    int pa[300],pb[300],to[100000],next[100000],val[100000],head[300],d[300],D[300];
    bitset<80010> f;
    queue<int> q;
    inline void add(int a,int b)
    {
    	to[cnt]=b,val[cnt]=1,next[cnt]=head[a],head[a]=cnt++;
    	to[cnt]=a,val[cnt]=1,next[cnt]=head[b],head[b]=cnt++;
    }
    int dfs(int x,int mf)
    {
    	if(x==2)	return mf;
    	int i,temp=mf,k;
    	for(i=head[x];i!=-1;i=next[i])	if(d[to[i]]==d[x]+1&&val[i])
    	{
    		k=dfs(to[i],min(temp,val[i]));
    		if(!k)	d[to[i]]=0;
    		val[i]-=k,val[i^1]+=k,temp-=k;
    		if(!temp)	break;
    	}
    	return mf-temp;
    }
    inline int bfs()
    {
    	memset(d,0,sizeof(d));
    	while(!q.empty())	q.pop();
    	int i,u;
    	d[1]=1,q.push(1);
    	while(!q.empty())
    	{
    		u=q.front(),q.pop();
    		for(i=head[u];i!=-1;i=next[i])	if(!d[to[i]]&&val[i])
    		{
    			d[to[i]]=d[u]+1;
    			if(to[i]==2)	return 1;
    			q.push(to[i]);
    		}
    	}
    	return 0;
    }
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    void work()
    {
    	n=rd(),m=rd(),ans=0;
    	int i,a,b;
    	memset(head,-1,sizeof(head)),memset(D,0,sizeof(D)),cnt=0;
    	for(i=1;i<=m;i++)	a=rd(),b=rd(),add(a,b),D[a]++,D[b]++;
    	while(bfs())	ans+=dfs(1,1<<30);
    	printf("%d ",m-ans);
    	f.reset(),f[n*n+D[1]-D[2]]=1;
    	for(i=3;i<=n;i++)	f=(f<<D[i])|(f>>D[i]);
    	for(i=0;i<=n*n;i++)	if(f[n*n+i]||f[n*n-i])
    	{
    		printf("%d
    ",i>>1);
    		return ;
    	}
    }
    int main()
    {
    	T=rd();
    	while(T--)	work();
    	return 0;
    }
  • 相关阅读:
    koa中静态文件资源中间件实现
    js数组扁平化
    js读写txt文件
    JDBC配置MSSQL
    Eclipse报错:Setting property 'source' to 'org.eclipse.jst.jee.server:xx' did not find a matching property
    JSON字符串的生成
    以POST方式推送JSON数据,并接收返回的服务器消息
    C# XML与Json之间相互转换实例详解
    eclipse配置Tomcat服务器server locations的方法
    uwsgi基础——SNMP
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7749778.html
Copyright © 2020-2023  润新知