题意:
对一个无向图用黑白两种颜色进行染色,规定一条边的两端不能同时为黑,问最多能有多少个点能染成黑色,并记录下这些点。
思路:
一开始就想到了dfs,但是一看n可能达到100就不敢写了,后面实在是没有思路了,上网搜题解发现别人也是直接用dfs做的,
于是就写一个。但这个题的dfs和一般图上的dfs还是有些不一样的:这个图上的dfs不是按照边来进行的,而是按点的编号进行的
因为一个点不是染成黑色就是染成白色。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Max 40000
int v[Max],w[Max],n,m,num,ans[Max],e;
int first[Max],next[Max],black[Max],temp[Max];
int check(int x)
{
for(int k=first[x];k!=-1;k=next[k])
{
if(black[v[k]]==1)
return 0;
}
return 1;
}
void dfs(int cur,int cnt)
{
int i;
if(cur==n+1)
{
if(cnt>num)
{
num=cnt;
for(i=0;i<cnt;i++)
ans[i]=temp[i];
}
return ;
}
if(check(cur))
{
black[cur]=1;
temp[cnt]=cur;
dfs(cur+1,cnt+1);
black[cur]=0;
}
black[cur]=2;
dfs(cur+1,cnt);
black[cur]=0;
}
void Init()
{
e=0;
memset(first,-1,sizeof(first));
memset(black,0,sizeof(black));
}
void add_e(int a,int b,int c)
{
v[e]=b; w[e]=c;
next[e]=first[a];
first[a]=e++;
}
int main()
{
int i,t,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
Init(); num=0;
for(i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add_e(a,b,1);
add_e(b,a,1);
}
dfs(1,0);
printf("%d\n",num);
for(j=0;j<num;j++)
{
if(j)
printf(" ");
printf("%d",ans[j]);
}
printf("\n");
}
return 0;
}