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"); } }