题意:给图按黑白着色,求一种着色方案使得图中着黑色的顶点数最多且这些顶点相互之间都不相邻.
分析: 求出补图的最大团即为答案。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) #define maxn 111 int g[maxn][maxn]; int res[maxn]; int s[maxn]; int sum; int n,m,sn,ans; void dfs(int r) { int i,j; if(r>n) { for(i=1;i<=n;i++) res[i]=s[i]; ans=sn; return; } bool flag=true; for(i=1;i<r;i++) if(s[i]==1&&!g[r][i]) { flag=false; break; } if(flag) { s[r]=1; sn++; dfs(r+1); sn--; } if(sn+n-r>ans) { s[r]=0; dfs(r+1); } } int main() { int t,i,j,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); clr(g); while(m--) { scanf("%d%d",&a,&b); g[a][b]=g[b][a]=1; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j) g[i][j]=!g[i][j]; sn=ans=0; clr(s); clr(res); dfs(1); printf("%d\n",ans); for(i=1;i<=n;i++) if(res[i]) printf("%d ",i); printf("\n"); } return 0; }