在改章节中,我们主要介绍独立树的内容,自我感到有个不错的建议和大家分享下
许久没做题了,做起题来感到各种没感到,简直弱爆了,
先说下这一题题意:就是给你一个无向图,有彩色两种颜色,让你对该图停止染色,求要意任相邻两点不能为一同种颜色,问你最后可以染多少个玄色的点顶,很显然是让你求最大独立集问题(所求得的该点顶中集意任两点都没有边),而经分析可知最大独立集=相对应完全图补图的最大团
而求最大团很易容想到用子集树来求,需只带一下子集树的板模就好了·~~
AC码代:
#include <iostream> #include<string.h> #include<algorithm> #include<cstdio> #define CLR(arr,val) memset(arr,val,sizeof(arr)) #define N 105 using namespace std; bool map[N][N]; int n,best[N]; bool x[N]; int Maxnum; void in(int &a) { char ch; while((ch=getchar())<'0'||ch>'9'); for( a=0;ch>='0'&&ch<='9';ch=getchar()) a=a*10+ch-'0'; } bool place(int t) { for(int i=1;i<t;++i) if(x[i]&&!map[i][t]) return false; return true; } void dfs(int t,int num) { if(t>n)//边界条件 { Maxnum=num; int k=0; for(int i=1;i<=n;++i) if(x[i]) best[++k]=i; return; } if(place(t))//约束条件 { x[t]=true; dfs(t+1,num+1); } if(num+n-t>=Maxnum) //限界条件 { x[t]=false; dfs(t+1,num); } } int main() { int T; in(T); while(T--) { Maxnum=0; CLR(x,false); int k; in(n),in(k); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) map[i][j]=true; for(int i=0;i!=k;++i) { int a,b; in(a),in(b); map[a][b]=map[b][a]=false; } dfs(1,0); cout<<Maxnum<<endl; for(int i=1;i<Maxnum;++i) cout<<best[i]<<" "; cout<<best[Maxnum]<<endl; }return 0; }
文章结束给大家分享下程序员的一些笑话语录: 一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。