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;
}
posted @ 2025-05-27 00:46  sirro1uta  阅读(25)  评论(0)    收藏  举报