题解 P1692 【部落卫队】

sukimo

2020-06-06 18:27:20

Solution

看到$n\leq100$的数据,不用想,直接上dfs。由于要输出组成名单,所以用一个数组来储存最优解。题目没有说多种可能性怎么选,所以应该是默认选字典序最小,那么搜索的顺序就要讲究。再加点剪枝就可以过。 ``` #include<bits/stdc++.h> using namespace std; int n,_max,array[105],rem[105];bool mark[105],hate[105][105]; void dfs(int now,int cnt){ if(_max<cnt){ _max=cnt;for(int i=1;i<=cnt;i++)rem[i]=array[i]; } if(now>n||n-now+1+cnt<_max)return; for(int i=1;i<=cnt;i++) if(hate[array[i]][now]){dfs(now+1,cnt);return;} array[cnt+1]=now;dfs(now+1,cnt+1);dfs(now+1,cnt); } int main(){ int m;scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int a,b;scanf("%d%d",&a,&b);hate[min(a,b)][max(a,b)]=1; } dfs(1,0); printf("%d\n",_max); for(int i=1;i<=_max;i++)mark[rem[i]]=1; for(int i=1;i<=n;i++)printf("%d ",mark[i]); return 0; } ```