华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1080|回复: 1
打印 上一主题 下一主题

P1692 部落卫队

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-10-2 19:35:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
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
回复

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
沙发
发表于 2019-7-2 19:20:49 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 04:40 , Processed in 0.098510 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表