305 字
2 分钟
AtCoder ABC448_D: D - Integer-duplicated Path Editorial
题目链接
题目大意
给定一棵有 个节点的树,第 个节点上写着一个整数 。
对于每个 ,考虑树上从节点 到节点 的唯一路径,判断这条路径上是否存在两个不同节点写着相同的整数。
如果存在,输出 Yes;否则输出 No。
解题思路
如果用 BFS 来为每个节点维护一个 set 集合的话,毫无疑问会 MLE,所以我们要使用 DFS。对树上的点进行遍历,具体做法就是到达一个点后,先判断它的父节点是否已经重复;如果已经重复,就直接标记即可;如果没有重复,就用 unordered_map 统计这个点的值出现的次数,判断当前路径上是否出现重复,再继续 DFS,回溯时记得在 map 上减掉这个值的数量即可。
代码实现
#include <bits/stdc++.h>using namespace std;const int N=2e5+10;int a[N];vector<int> q[N];bool success[N];unordered_map<int, int> m;int n, u, v;void dfs(int u, int fa){ for(int t:q[u]){ if(t==fa) continue; m[a[t]]++; if(success[u]) success[t]=true; if(m[a[t]]>=2) success[t]=true; dfs(t, u); m[a[t]]--; }}int main(){ scanf("%d", &n); for(int i=1;i<=n;i++) scanf("%d", &a[i]); for(int i=1;i<=n-1;i++){ scanf("%d%d", &u, &v); q[u].push_back(v), q[v].push_back(u); } m[a[1]]++; dfs(1, -1); for(int i=1;i<=n;i++){ if(success[i]==false) printf("No\n"); else printf("Yes\n"); } return 0;} AtCoder ABC448_D: D - Integer-duplicated Path Editorial
https://shenyize.com/posts/atcoder/abc448_d/