代码:
#include <bits/stdc++.h>
#define LL k<<1
#define RR k<<1|1
#define int long long
using namespace std;
const int N = 21;
int ans, n, m;
map<string, int>mp;
map<int, string>pm;
unordered_set<int>st[N];
vector<string>a;
void dfs(int k, int b[]) { //b[i] 代表 i 能不能去以及去没去(0 能去,1 不能去,2 去了) cnt 记录答案 k 代表当前是第几位
// for(int i=1;i<=n;i++){
// cout<<b[i]<<' ';
// }
// cout<<'\n';
if (k > n) {
int cnt=0;
for(int i=1;i<=n;i++){
if(b[i]==2)++cnt;
}
if(cnt>ans){
ans=cnt;
a.clear();
for(int i=1;i<=n;i++){
if(b[i]==2){
a.push_back(pm[i]);
}
}
}
return;
}
if (b[k]==1){
dfs(k + 1, b);
}//如果有敌对关系的人去了
for(int i=0;i<=1;i++){//0 代表这个人不去 1 代表这个人去
if(i){//去
for(auto v:st[k]){
b[v]=1;
}
b[k]=2;
}
dfs(k+1,b);//进入下一个
}
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
mp[s] = i; //记录数字编号
pm[i] = s; //记录文字
}
for (int i = 1; i <= m; i++) {
string u, v;
cin >> u >> v;
st[mp[u]].insert(mp[v]);//记录敌对关系
st[mp[v]].insert(mp[u]);//看起来很像无向图(雾)
}
int damn[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//17个0防伪认证(不是
dfs(1, damn); //开始dfs
cout << ans<<'\n';
sort(a.begin(),a.end());//字典序排序
for(auto v:a){
cout<<v<<'\n';
}
return 0;
}
错误数据点:
输入:
6 6
Alena
Olya
Vanya
Brus
John
Alice
Alena John
Alena Alice
Olya John
Olya Alice
Vanya John
Vanya Alice
我的输出
3
Alice
Brus
John
答案
4
Alena
Brus
Olya
Vanya
不知道哪里错了,求调!