UVa193Graph Coloring

DFS

题意:相邻的节点不能都涂成黑色,问是黑色节点最多的方案(只能选择黑和白)

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int G[101][101],black[101],ANS[101];
int n,m,ans;
void DFS(int cur,int w)//cur当前要处理的节点,当前已有白色节点个数
{
	if(w>=n-ans)return;//白色节点多于最优情况下白色节点时
	if(cur==n+1)
	{
        ans=n-w;
        for(int i=1;i<=n;i++)
		{
			if(black[i])ANS[i]=1;
			else ANS[i]=0;
		}
		return;
	}
	for(int j=0;j<=1;j++)
	{
		if(j==0)DFS(cur+1,w+1);
		if(j==1)
		{
			for(int k=1;k<=n;k++)
			{
				if(G[cur][k]&&black[k])return;
			}
			black[cur]=1;
			DFS(cur+1,w);
			black[cur]=0;
		}
	}
	return;
}
int main()
{
	int cas,x,y;
	scanf("%d",&cas);
	while(cas--)
	{
		memset(black,0,sizeof(black));
		memset(ANS,0,sizeof(ANS));
		memset(G,0,sizeof(G));
		scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
		{
             scanf("%d%d",&x,&y);
			 G[x][y]=1;
			 G[y][x]=1;
		}
		ans=0;
		DFS(1,0);
        int f=0;
		printf("%d\n",ans);
		for(int i=1;i<=n;i++)
		{
			
			if(ANS[i]&&f)printf(" %d",i);
			else if(ANS[i]){printf("%d",i);f=1;}
		}
		printf("\n");
		
	}
}
posted on 2011-04-02 16:51  4.5.6  阅读(183)  评论(0编辑  收藏  举报