题目大意:
给你n个人的英文名与m组关系,每组关系中的人不能同时存在于一个小组里,问你最多能选多少个人到一个小组里
思路:
因为数据量小直接枚举
按01枚举直接判断可行不可行
可行就与之前的最大值进行比较,如果大的话就更新数组数据与最大值即可
(当时校队训练的时候想的是贪心- -)
贪心的话卡到test15就过不去了(反正我是)
(不知道是不是训练的时候玩手机脑子不正常了枚举都没想到,晕死)
AC代码:
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
string s[20];
struct node
{
string a,b;
};
node a[1010];
string ans[20];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0; i<n; i++)cin>>s[i];
for(int i=0; i<m; i++)
{
cin>>a[i].a>>a[i].b;
}
int temp=(1<<n)-1;
int ansn=0;
for(int i=0; i<=temp; i++)
{
int t=i;
map<string,int>vis;
int k=0;
while(t)//01枚举
{
if(t&1)
{
vis[s[k]]=1;
}
t>>=1;
k++;
}
int ok=1;
int cnt=0;
for(int j=0; j<n; j++)
{
if(vis[s[j]])
{
cnt++;
for(int f=0; f<m; f++)
{
if(s[j]==a[f].a)
{
if(vis[a[f].b]==1)
{
ok=0;
break;
}
}
if(s[j]==a[f].b)
{
if(vis[a[f].a])
{
ok=0;
break;
}
}
}
}
}
if(ok){
if(ansn<cnt){
int f=0;
ansn=cnt;
for(int j=0;j<n;j++){
if(vis[s[j]]){
ans[f++]=s[j];
}
}
}
}
}
cout<<ansn<<endl;
sort(ans,ans+ansn);
for(int i=0;i<ansn;i++)cout<<ans[i]<<endl;
return 0;
}