比赛 20120708 评测结果 AAAAATTTTT
题目名称 硬币收集者 最终得分 50
用户昵称 Citron酱 运行时间 10.095 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2012-07-08 10:25:55
显示代码纯文本
#include <cstdio>

#define I_F "coinmn.in"
#define O_F "coinmn.out"

const short MAXn=300;
const int MAXc=10000+1;
const long P=10000000;

int s[MAXn][2][2];
short c[MAXc];
short n;
int now=0, ans;
long l;

void Input();
short Root(const short&);
void Dfs(const short&);
void Output();

int main()
{
	freopen(I_F,"r",stdin);
	freopen(O_F,"w",stdout);
	scanf("%hd",&n);
	while (n>0)
	{
		Input();
		Dfs(0);
		Output();
		scanf("%hd",&n);
	}
}

short Root(const short &x)
{
	if (c[x]!=x)
		return Root(c[x]);
	return x;
}

void Input()
{
	for (int i=0; i<n; ++i)
		scanf("%d%d%d%d",&s[i][0][0],&s[i][0][1],&s[i][1][0],&s[i][1][1]);
	for (int i=0; i<MAXc; ++i)
		c[i]=i;
	ans=0;
	l=0;
}

void Dfs(const short &x)
{
	if (++l>=P)
		return;
	if (x==n)
	{
		ans=(now>ans)?now:ans;
		return;
	}
	if (now+(n-x)*2<=ans)
		return;
	short a,b;
	for (short i=0; i<2 && l<P; ++i)
	{
		a=Root(s[x][i][0]);
		b=Root(s[x][i][1]);
		if (a!=b)
		{
			c[b]=a;
			now+=2;
			Dfs(x+1);
			now-=2;
			c[b]=b;
		}
	}
	Dfs(x+1);
}

void Output()
{
	printf("%d\n",ans);
}