帮帮我!(带注释)
  • 板块灌水区
  • 楼主Igallta
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/24 21:12
  • 上次更新2024/5/24 21:18:39
查看原帖
帮帮我!(带注释)
813622
Igallta楼主2024/5/24 21:12

题目

代码:

#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

不知道哪里错了,求调!

2024/5/24 21:12
加载中...