codeforces F. DFS
题目在这
https://codeforces.com/contest/1044/problem/F
很基础的题目适合我
慢慢来
已经在输入给了树构造的细节,所以我们不需要构造树了,只要判断构造完交换位置后是否能满足dfs
关键代码
点击查看代码
int is_valid_dfs(int n) {
for (int i = 1; i <= n; i++) {
//child_count[i] 是节点 i 的孩子数量
for (int j = 0; j < child_count[i]; j++) {
int child = tree[i][j];
//i表示父亲节点 child表示孩子节点 要求父亲节点的位置在前
if (pos[i] >= pos[child]) {
return 0;
}
}
}
这里我展开给自己讲一下
tree是一个 二维数组,用于存储每个节点的孩子节点。
• 第一维(tree[i]):表示第 i 号节点
• 第二维(tree[i][j]):表示第 i 号节点的第 j 个孩子
所以这里child 表示的是 “孩子节点的编号”
这个代码大体上是正确的还有一些小问题改一改才能够ac
完整代码如下
点击查看代码
#include <stdio.h>
#define MAXN 65536
int tree[MAXN][2];
int child_count[MAXN];
int p[MAXN];
int pos[MAXN];
int is_valid_dfs(int n) {
for (int i = 1; i <= n; i++) {
//child_count[i] 是节点 i 的孩子数量
for (int j = 0; j < child_count[i]; j++) {
int child = tree[i][j];
//i表示父亲节点 child表示孩子节点 要求父亲节点的位置在前
if (pos[i] >= pos[child]) {
return 0;
}
}
}
return 1;
}
int main(){
int t;
scanf("%d",&t);
for(int i = 0; i < t; i++){
int n,q;
scanf("%d%d",&n,&q);
for (int i = 1; i <= n; i++) {
child_count[i] = 0;
}
//输入p对应的
for (int i = 2; i <= n; i++) {
int parent;
scanf("%d", &parent);
tree[parent][child_count[parent]++] = i;
}
// 输入 p[1]到[n]
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
}
//构建每个值在当前排列中的位置映射
for (int i = 1; i <= n; i++) {
pos[p[i]] = i;
}
for(int i = 0; i < q; i++){
int x,y;
scanf("%d %d", &x, &y);
int temp = p[x];
p[x] = p[y];
p[y] = temp;
//更新交换后的位置
for (int i = 1; i <= n; i++) {
pos[p[i]] = i;
}
if (is_valid_dfs(n)) {
printf("Yes\n");
} else {
printf("No\n");
}
}
}
return 0;
}

浙公网安备 33010602011771号