(C++)白駿3584最近の共通祖先
https://www.acmicpc.net/problem/3584
簡単な木の問題...
まず、ノードxの親ノードを返す関数findParent(int x)を定義し、次のように記述します.
親ノードをアレイに格納する. 最後の2つの所与のノードの親ノードfindParentを検索し、各ノードはベクトルに を格納する.
2つのベクトルを比較して、同じ値 を検索します.
簡単な木の問題...
まず、ノードxの親ノードを返す関数findParent(int x)を定義し、次のように記述します.
親ノードを
2つのベクトル
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int T,N;
int node[10005]; // memorize parent node
int x,y,A,B;
int ans;
int root;
int findParent(int x){
return node[x];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
cin>>N;
memset(node, 0, sizeof(node));
for(int i=0; i<N-1; i++) {
cin>>x>>y;
node[y]=x;
}
for(int i=1; i<=N; i++){
if(node[i]==0){
root=i;
break;
}
}
cin>>A>>B;
vector<int> nodeA;
vector<int> nodeB;
while(A!=0 || B!=0) {
if(A!=0){
nodeA.push_back(A);
A = findParent(A);
}
if(B!=0){
nodeB.push_back(B);
B = findParent(B);
}
}
bool flag=false;
for(int i=0; i<nodeA.size(); i++){
for(int j=0; j<nodeB.size(); j++){
if(nodeA[i]==nodeB[j]) {
ans=nodeA[i];
flag=true;
}
}
if(flag) break;
}
if(ans==0) ans=root;
cout<<ans<<'\n';
}
}
Reference
この問題について((C++)白駿3584最近の共通祖先), 我々は、より多くの情報をここで見つけました https://velog.io/@minayeah/C-백준-3584-가장-가까운-공통-조상テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol