bzoj1130:[POI2008]POD Subdivision of Kingdom

传送门

看到数据范围这么小,不由得算了一下暴力复杂度,算出来情况一共只有1e7,不多,再乘上暴力判断的复杂度,好像T了,判断的话位运算可以方便解决
但是我写的优化似乎比较渣,还留了个log,但是还是n那么小,log可以忽略不计了吧
代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
#define rg register
int n,m,a[27],f[27],b[27],ans=1e9,ans1,mod;
void dfs(int x,int now,int dep,int y)
{
	if(dep==n/2+1)
	{
		if(y<ans)ans=y,memcpy(f,b,sizeof f);
		return ;
	}
	for(rg int i=x;i<=n;i++)
	{
		int g=a[i]&now,f=0,k=0;
		for(rg int j=g;j;j-=(j&(-j)))f++;
		g=a[i]&(mod-now);
		for(rg int j=g;j;j-=(j&(-j)))k++;
		b[dep]=i,dfs(i+1,now|(1<<(i-1)),dep+1,y-f+k);
	}
}
int main()
{
	scanf("%d%d",&n,&m);mod=(1<<n)-1;
	for(rg int i=1,x,y;i<=m;i++)scanf("%d%d",&x,&y),a[x]|=(1<<(y-1)),a[y]|=(1<<(x-1));
	b[1]=1,dfs(2,1,2,0);
	for(rg int i=1;i<=n/2;i++)printf("%d ",f[i]);
}
posted @ 2019-02-19 13:41  蒟蒻--lichenxi  阅读(102)  评论(0编辑  收藏  举报