题意
给你一张图,相邻两个点不能都图成黑色(但可以都是白的,或一黑一白),问最多能涂多少个黑色的点
题解
这题啊,应该是求最大独立子集
然后我们要知道,最大独立子集=补图的最大团
那么,我们这道题就要求原图的补图,然后再求最大团咯
再说说最大团怎么写呢
最大团很好玩,我学了一晚上!(没学会【捂脸】)
那么怎么求呢!
这是个np问题呢!
所以,就dp吧【捂脸】
而且这题…数据emmmm(请自行想象~)
所以..它它它根本不用求补图..就直接dp就可以了【捂脸】
啊犯了这么多神经..啊没事反正没人看~
———————————2018年3月16日23点43分 纪念此犯神经的时刻
代码
#include <cstdio>
#include <cstring>
#define N 110
int T,n,m,cnt,mx,mp[N][N],col[N],ans[N];
void dfs(int x){
if(x==n+1){
if(cnt>mx){
mx=cnt;
memcpy(ans,col,sizeof(col));
}return ;
}
int flag=1;
for(int i=1;i<=n;i++) if(i!=x && mp[x][i] && col[i]){flag=0;break;}
if(flag){
cnt++;col[x]=1;
dfs(x+1);
cnt--;col[x]=0;
}dfs(x+1);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
memset(mp,0,sizeof(mp));
memset(col,0,sizeof(col));
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
mp[x][y]=mp[y][x]=1;
}cnt=0;mx=0;dfs(1);
printf("%d\n",mx);
for(int i=1;i<=n;i++) if(ans[i]) printf("%d ",i);printf("\n");
}
return 0;
}