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");
}
}
浙公网安备 33010602011771号