思路
首先容易发现num[i] 仅仅只有50.
又因为树是一颗有层次的结构,当前节点的祖先节点,也就是从祖先结点一直到当前结点。
而且要最近的。那么其实我们只需要更新路径上的值的拥有者即可。
ok[i]=x 表示结点x的num[x]=i
我们进行bfs,每次下传一个vector 保存了1到50的数值的拥有者。
因为要离得最近的,我们这样子只是存了这个数值最近是谁的。可能当前数值和很多祖先互质。
所以我们还需要用dep维护一个深度。儿子结点的深度等于当前结点深度+1
代码
class Solution {
public:
vector<int> e[1<<17];
int val[1<<17];
int vis[1<<17];
int dep[1<<17];
vector<int> ans;
vector<int> getCoprimes(vector<int>& nums, vector<vector<int>>& edges) {
ans.resize(nums.size());
for(int i=0;i<nums.size();i++){
val[i]=nums[i];
}
for(auto &x:edges){
e[x[0]].push_back(x[1]);
e[x[1]].push_back(x[0]);
}
vector<int>ok(51,-1);
queue<pair<int,vector<int>>> que;
que.push({0,ok});
vis[0]=1;
dep[0]=1;
while(!que.empty()){
pair<int,vector<int>> now=que.front();
que.pop();
int x=now.first;
vector<int>&ok=now.second;
int kk=-1,ma=-1;//kk表示答案 ma表示最深的深度 即离当前结点最近的点
for(int i=1;i<=50;i++){
if(ok[i]!=-1 && __gcd(i,val[x])==1){//有祖先结点拥有数值i 并且i与val[x]互质
if(ma<dep[ok[i]]){//祖先节点ok[i]离当前结点更近
ma=dep[ok[i]];
kk=ok[i];
}
}
}
ans[x]=kk;//答案
ok[val[x]]=x;//更新val[x]数值的拥有者为当前结点x
for(auto &son:e[x]){
if(vis[son]==0){
vis[son]=1;
dep[son]=dep[x]+1;//更新深度
que.push({son,ok});
}
}
}
return ans;
}
};