华师一附中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
#include<iostream>
using namespace std;
int n,m,x,y,ans=-1,cnt,c[101],best[101],a[101][101],b[101],p[101];
void dfs(int k)
{
if(k>n)
{
if(cnt>ans)
{
ans=cnt;
for(int i=1; i<=cnt; i++)best[i]=c[i];
}
return;
}
if(!b[k])
{
b[k]++,c[++cnt]=k;
for(int i=1; i<=n; i++)b[i]+=a[k][i];
dfs(k+1);
cnt--,b[k]--;
for(int i=1; i<=n; i++)b[i]-=a[k][i];
}
dfs(k+1);
}
int main()
{
cin>>n>>m;
for(int i=1; i<=m; i++)
cin>>x>>y,a[x][y]=a[y][x]=1;
dfs(1);
cout<<ans<<endl;
for(int i=1; i<=ans; i++)p[best[i]]++;
for(int i=1;i<=n;i++)cout<<p[i]<<' ';
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2