比赛 20120417 评测结果 AAAAAATTTAAAAAATA
题目名称 牛棚的灯 最终得分 76
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-17 10:16:42
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
int n,m,f[40]={0};
bool used[40]={0};
typedef vector<int>vec;
vec a[40];
int w[40],answer=100;
void dfs(int x,int y,int z);
int main()
{
	freopen ("lights.in","r",stdin);
	freopen ("lights.out","w",stdout);
	cin>>n>>m;
	for (int i=0;i<m;i++)
	{
		int b,c;
		cin>>b>>c;
		a[b].push_back(c);
		a[c].push_back(b);
	}
	for (int i=1;i<=n;i++)
	{
		a[i].push_back(i);
		f[i]=i;
	}
	for (int i=1;i<n;i++)
	{
		for (int j=i+1;j<=n;j++)
		{
			if (a[i].size()<a[j].size())
			{
				int tmp;
				tmp=f[j];
				f[j]=f[i];
				f[i]=tmp;
			}
		}
	}
	dfs(0,0,0);
	cout<<answer;
	return 0;
}

void dfs(int x,int y,int z)
{
	if (y==n&&x==n)
	{
		if (z<answer)
			answer=z;
		return;
	}
	if (x==n)
		return;
	if (z>answer)
		return;
	int yy;
	bool use[40]={0};
	yy=y;
	for (int i=1;i<=n;i++)
		use[i]=used[i];
	for (int i=0;i<2;i++)
	{
		if (i==1)
		{
			x++;
			for (int j=0;j<a[f[x]].size();j++)
			{
				if (used[a[f[x]][j]])
				{
					used[a[f[x]][j]]=0;
					y--;
				}
				else 
				{
					if(!used[a[f[x]][j]])
					{
						used[a[f[x]][j]]=1;
						y++;
					}
				}
			}
			dfs(x,y,z+1);
			x--;
			y=yy;
			for (int i=1;i<=n;i++)
				used[i]=use[i];
		}
		if (i==0)
		{
			dfs(x+1,y,z);
		}
		y=yy;
		for (int i=1;i<=n;i++)
			used[i]=use[i];
	}
}