华师一附中OI组

标题: P1692 部落卫队 [打印本页]

作者: admin    时间: 2018-10-2 19:35
标题: P1692 部落卫队
https://www.luogu.org/problemnew/show/P1692

题目描述
原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌。

给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案。

输入输出格式
输入格式:
第1行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系。居民编号为1,2,…,n。接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌。

输出格式:
第1行是部落卫队的人数;文件的第2行是卫队组成x i,1≤i≤n,xi =0 表示居民i不在卫队中,xi=1表示居民i在卫队中。

输入输出样例
输入样例#1:
7  10
1  2
1  4
2  4
2  3
2  5
2  6
3  5
3  6
4  5
5  6
输出样例#1:
3
1 0 1 0 0 0 1
说明
60%数据:n<=20,m<=100

所有数据:n<=100,m<=3000
作者: 黄煦喆    时间: 2019-7-2 19:20
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,x,y,ans=-1,cnt,c[101],best[101],a[101][101],b[101],p[101];
  4. void dfs(int k)
  5. {
  6.     if(k>n)
  7.     {
  8.         if(cnt>ans)
  9.         {
  10.             ans=cnt;
  11.             for(int i=1; i<=cnt; i++)best[i]=c[i];
  12.         }
  13.         return;
  14.     }
  15.     if(!b[k])
  16.     {
  17.         b[k]++,c[++cnt]=k;
  18.         for(int i=1; i<=n; i++)b[i]+=a[k][i];
  19.         dfs(k+1);
  20.         cnt--,b[k]--;
  21.         for(int i=1; i<=n; i++)b[i]-=a[k][i];
  22.     }
  23.     dfs(k+1);
  24. }
  25. int main()
  26. {
  27.     cin>>n>>m;
  28.     for(int i=1; i<=m; i++)
  29.         cin>>x>>y,a[x][y]=a[y][x]=1;
  30.     dfs(1);
  31.     cout<<ans<<endl;
  32.     for(int i=1; i<=ans; i++)p[best[i]]++;
  33.     for(int i=1;i<=n;i++)cout<<p[i]<<' ';
  34.     return 0;
  35. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2