题目链接:http://poj.org/problem?id=1419
题目大意:给出你一个无向图,然后对其中的点去上色, 只能上黑色和白色,要求是黑色点不能相邻,问最多能上多少黑色的顶点
解题思路:数据量是100,所以爆索的话时间复杂度是2^100,这个方法本来行不通。但是,由于题目的数据太弱了,用暴搜的方法就可以直接解决。
#include <iostream>
#include <vector>
#include <memory.h>
#include <stdio.h>
using namespace std;
const int MAXN=100+5;
bool color[MAXN];
int ans[MAXN];
int MAX=0;
vector<int> G[MAXN];
void dfs(int num,int cou,int n)
{
if(num==n+1)
{
if(cou>MAX)
{
memset(ans,0,sizeof(ans));
MAX=cou;
for(int i=1;i<MAXN;i++)
if(color[i])
ans[i]=1;
}
return;
}
bool flag=true;
for(int i=0;i<G[num].size();i++)
{
if(color[G[num][i]])
flag=false;
}
if(flag)
{
color[num]=true;
dfs(num+1,cou+1,n);
color[num]=false;
}
dfs(num+1,cou,n);
}
int main()
{
int m;
cin>>m;
while(m--)
{
int n,k;
cin>>n>>k;
int temp1,temp2;
memset(color,0,sizeof(color));
memset(ans,0,sizeof(ans));
for(int i=0;i<MAXN;i++)
G[i].clear();
for(int i=1;i<=k;i++)
{
cin>>temp1>>temp2;
G[temp1].push_back(temp2);
G[temp2].push_back(temp1);
}
dfs(1,0,n);
cout<<MAX<<endl;
int t=1;
for(int i=1;i<MAXN;i++)
{
if(ans[i])
{
printf(t==1?"%d":" %d",i);
t++;
}
}
printf("\n");
MAX=0;
}
return 0;
}