DFS剪枝,最大团,POJ(1419)
题目链接:http://poj.org/problem?id=1419
题目大意:一个无向图,用黑白涂色,相邻的两个点不能图同一种颜色,求黑色的点最多有几个?
刚一看题,完全是图的m着色问题啊,我就套模板,好吧,搞了半天没出来,看了一下别人的博客,原来还是有不同的地方,求最大团。
这里DFS回溯时,加上剪枝。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int NN=102; int n,ans,cnt,x[NN],opt[NN]; bool map[NN][NN]; void dfs(int i) { if (i>n) { ans=cnt; for (int i=1; i<=n; i++) opt[i]=x[i]; return; } bool flag=true; for (int j=1; j<i && flag; j++) if (x[j]==1 && !map[j][i]) flag=false; if (flag) { x[i]=1; cnt++; dfs(i+1); cnt--; } if (cnt+n-i>ans)///可行性剪枝 { x[i]=0; dfs(i+1); } } int main() { int cas,m,x,y; scanf("%d",&cas); while (cas--) { scanf("%d%d",&n,&m); memset(map,1,sizeof(map)); for (int i=1; i<=m; i++) { scanf("%d%d",&x,&y); map[x][y]=map[y][x]=0; } ans=cnt=0; dfs(1); ///求最大团 printf("%d\n",ans); for (int i=1; i<=n; i++) if (opt[i]) printf("%d ",i); printf("\n"); } return 0; }