比赛 20120708 评测结果 AAATTTTTTT
题目名称 硬币收集者 最终得分 30
用户昵称 Czb。 运行时间 14.665 s
代码语言 C++ 内存使用 0.35 MiB
提交时间 2012-07-08 11:39:21
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<vector>
#define max(a,b) a>b?a:b

using namespace std;

struct orz
{
	int x,y;
}a[301][2];

int n,ans;

int flag1[10001];

vector <orz> v;

bool flag()
{
	memset(flag1,0,sizeof(flag1));
	int tmp=0;
	bool bo=true;
	for(int i=0;i<v.size();i++)
	{
		flag1[v[i].x]++;
		flag1[v[i].y]++;
	}
	while(bo)
	{
		bo=false;
		for(int i=0;i<v.size();i++)
		{
			if(flag1[v[i].x]==1||flag1[v[i].y]==1)
			{
				bo=true;
				tmp++;
				flag1[v[i].x]--;
				flag1[v[i].y]--;
			}
		}
	}
	if(tmp==v.size())
		return true;
	return false;
}

void dfs(int k)
{
	if(k>n)
	{
		if(flag())
		{
			ans=max(ans,v.size());
		}
		return;
	}
	dfs(k+1);
	if(a[k][0].x!=a[k][0].y)
	{
		v.push_back(a[k][0]);
		dfs(k+1);
		v.pop_back();
	}
	if(a[k][1].x!=a[k][1].y)
	{
		v.push_back(a[k][1]);
		dfs(k+1);
		v.pop_back();
	}
}

int main()
{
	freopen("coinmn.in","r",stdin);
	freopen("coinmn.out","w",stdout);
	int i,j;
	for(scanf("%d",&n);n;scanf("%d",&n))
	{
		ans=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d%d",&a[i][0].x,&a[i][0].y);
			scanf("%d%d",&a[i][1].x,&a[i][1].y);
		}
		dfs(1);
		printf("%d\n",ans<<1);
	}
	return 0;
}