来源:https://atcoder.jp/contests/abc190/tasks/abc190_c
一、题目
N个盘子,M个条件,当且仅当Ai和Bi盘子上有球时,条件i被满足。有K个顾客,每个顾客会在盘子Ci或者Di上放一个球。问最多有多少条件被满足?
二、输入
N M
A1 B1
.
.
.
AM BM
K
C1 D1
.
.
.
Ck Dk
三、输出
输出答案
四、样例
input:
4 4
1 2
1 3
2 4
3 4
3
1 2
1 3
2 3
output:
2
input:
4 4
1 2
1 3
2 4
3 4
4
3 4
1 2
2 4
2 4
output:
4
input:
6 12
2 3
4 6
1 2
4 5
2 6
1 5
4 5
1 3
1 2
2 6
2 3
2 5
5
3 5
1 4
2 6
4 6
5 6
output:
9
五、思路 + 代码
dfs
代码如下:
#include<iostream>
#include<map>
using namespace std;
int Max(int a, int b) {
return a > b ? a : b;
}
int N, M, K;
int maxCdt;
int dishes[110];//有东西为1无为0
pair<int, int> cdt[110];//条件
pair<int, int> cstm[110];//顾客
//有多少满足条件
int check() {
int cnt = 0;
for (int i = 0; i < M; i++) {
if (dishes[cdt[i].first] && dishes[cdt[i].second]) {
cnt++;
}
}
return cnt;
}
//第i个顾客
void dfs(int i) {
if (i == K) {
maxCdt = Max(maxCdt, check());
return;
}
dishes[cstm[i].first]++;
dfs(i + 1);
dishes[cstm[i].first]--;
dishes[cstm[i].second]++;
dfs(i + 1);
dishes[cstm[i].second]--;
}
int main() {
cin >> N >> M;
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
cdt[i] = make_pair(a, b);
}
cin >> K;
for (int i = 0; i < K; i++) {
int c, d;
cin >> c >> d;
cstm[i] = make_pair(c, d);
}
dfs(0);//从0号顾客开始dfs
cout << maxCdt << endl;
return 0;
}
该博客介绍了如何运用深度优先搜索(DFS)策略解决一个计算机科学竞赛中的问题。给定N个盘子和M个条件,只有当特定的盘子Ai和Bi上有球时,条件i才满足。有K个顾客会在指定的盘子上放置球。博客提供了输入输出样例及相应的C++代码实现,展示了如何通过DFS遍历所有可能的球放置情况,以找出最多能同时满足多少个条件。

被折叠的 条评论
为什么被折叠?



