package 第九届javab;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class 版本分支_树 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int Q = sc.nextInt();
TreeNode trees[] = new TreeNode[N+1];
for(int i = 1;i<=N;i++)
trees[i] = new TreeNode(i);//初始化树
int arr[][] = new int[N-1][2];
HashSet<Integer> i0 = new HashSet<Integer>();
HashSet<Integer> i1 = new HashSet<Integer>();
for(int i = 0;i<arr.length;i++){
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
i0.add(arr[i][0]);
i1.add(arr[i][1]);
}
i0.removeAll(i1);
int rot=0;
for(int i:i0)
rot = i;//寻找根节点
System.out.println(rot);
MyTree myTree = new MyTree(trees[rot]);
for(int i = 0;i<arr.length;i++){
myTree.insert(trees[arr[i][0]],trees[arr[i][1]]);//树的构建
}
myTree.print();
for(int i = 0;i<Q;i++){
int x = sc.nextInt();
int y = sc.nextInt();
f(trees[x], trees[y]);
}
}
static void f(TreeNode parent,TreeNode child){
HashSet<TreeNode> hashSet = new HashSet<TreeNode>();
hashSet.add(child);
while(child.parent!=null){
hashSet.add(child.parent);
child = child.parent;
}
if(hashSet.contains(parent)){
System.out.println("YES");
}else
System.out.println("NO");
}
}
class MyTree{
TreeNode root;
int size=0;
public MyTree(TreeNode root){
this.root = root;
size++;
}
public void insert(TreeNode p,TreeNode child){
if(p.children==null)
p.children = new ArrayList<TreeNode>();
p.children.add(child);
child.parent = p;
}
public void print(){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode tmp = queue.poll();
if(tmp.children!=null)
for(TreeNode iMyTree:tmp.children)
queue.add(iMyTree);
System.out.println(tmp);
}
}
}
class TreeNode{
int data;
TreeNode parent;
ArrayList<TreeNode> children;
public TreeNode(int data){
this.data = data;
}
@Override
public String toString() {
return "TreeNode [data=" + data + "]";
}
}
05-31