现最快解法(其实区别不大)
2024-04-29 22:19:34
发布于:浙江
22阅读
0回复
0点赞
看到连AC君都不解释一下,我顿感痛心,题解的树枝呢?(dogeMacw07大佬规范题解的艺术
题意分析:
给定一群人和仇恨关系,要选尽量多的人来入伍,但不能选有仇恨的人,求最多几人并要记录队伍的人
解题思路:
我想了想,首先用邻接矩阵存仇恨是肯定的,之后记得将自己和自己标记,于是乎,就可以开始dfs遍历了每次不断遍历,能选就选,每次遍历完就比较一下,看看是否比原来此时最大答案的人多,若满足,就交换
代码实现:
#include<bits/stdc++.h>//传统万能头
using namespace std;
const int N = 1e3 + 5; //极值,个人习惯加5
int n, k, vis[N][N], maxn, maxy, s, a[N], ans[N];
void dfs(int x, int sum) {
if (x > n) {
if (sum > maxn) {//比之前的选法更好就留下
maxn = sum;
for (int i = 1; i <= n; i++) {
ans[i] = a[i];//替换选的人
}
}
return;
}//人查完一遍,看看能否更新,做个判断
bool flag = false;
if (a[x] == 0) flag = true;//可以带上就先带上
else dfs(x + 1, sum);//提前向下dfs,不然多运行下面的一串应该会超时
for (int i = 1; i <= n; i++) {
if (vis[x][i] == 1 && a[i] == 1) {//和另一个已入伍的人冲突
flag = false;
break;//不收,提前退掉
}
}
if (flag) {
a[x] = 1;
dfs(x + 1, sum + 1);//能选就先选
a[x] = 0;//回溯
}
dfs(x + 1, sum);//必不可少在dfs一遍
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);//cin,cout解绑加速
cin >> n >> k;
for (int i = 1; i <= k; i++) {
int x, y;
cin>>x>>y;
vis[x][y] = 1,vis[y][x] = 1;//邻接矩阵标记仇恨
}
for (int i = 1; i <= n; i++)vis[i][i] = 1;//自己不能重复选
dfs(1, 0);//从第一个人开始遍历
cout << maxn << endl;
for (int i = 1; i <= n; i++)cout << ans[i] << " ";
return 0;//完结撒花
}
就这么多,再编就有点难了......
题外话:
三体ACGO分部等你!快来!!!
这里空空如也
有帮助,赞一个