openjudge P1330:Nearest Common Ancestors LCA java实现

这是求公共父祖先的问题.

将需要求解的两个点调整到同一层后,向上查找即可.

只是,不知为何读取输入会报Runtime Error.和题目

P3723 Conscription

一样..... :nu:

使用其它读取输入方式后,AC

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
public static void main(String[] args) throws Exception {
sc.init(System.in );
int T = sc.nextInt();
while (T-- >0){
int n = sc.nextInt();;
int[] pre = new int[n+1];
int start;
int end;
LinkedList[] edges = new LinkedList[n+1];
for(int i = 0;i<n+1;i++){
edges[i] = new LinkedList<>();
}
for(int i =1;i<n;i++){
start = sc.nextInt();
end = sc.nextInt();
pre[end] = start;
edges[start].add(end);
}
int root = 0;
for(int i = 1;i<n+1;i++)
{
if(pre[i] == 0){
root = i;
break;
}
}
int[] levelData = new int[n+1];
ArrayDeque dq = new ArrayDeque<>();
dq.add(root);
int p;
int level=1;
int currentLevelCnt;
while(!dq.isEmpty()){
currentLevelCnt = dq.size();
for(int levelLoop = 0;levelLoop<currentLevelCnt;levelLoop++){
p = dq.poll();
levelData[p] = level;
for(int nextP:edges[p]){
dq.add(nextP);
}
}
level++;
}
int p1 = sc.nextInt();
int p2 = sc.nextInt();
int resultP1 = levelData[p1];
int resultP2 = levelData[p2];
int levelP1 = levelData[p1];
int levelP2 = levelData[p2];
if(levelP1== 1 || levelP2 == 1){
System.out.println(root);
continue;
}
while(levelP1!=levelP2){
if(levelP1>levelP2){
p1 = pre[p1];
levelP1--;
}
else{
p2 = pre[p2];
levelP2--;
}
}

        int result = 0;
        while(p1!=p2){
            p1 = pre[p1];
            p2 = pre[p2];
        }
        int father = p1;
        System.out.println(father);
    }
}

}
class sc {
static BufferedReader reader;
static StringTokenizer tokenizer;
/** call this method to initialize reader for InputStream /
static void init(InputStream input) {
reader = new BufferedReader(
new InputStreamReader(input) );
tokenizer = new StringTokenizer("");
}
/
* get next word */
static String next() throws IOException {
while ( ! tokenizer.hasMoreTokens() ) {
//TODO add check for eof if necessary
tokenizer = new StringTokenizer(
reader.readLine() );
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt( next() );
}
}

posted @ 2021-04-30 16:55  Monstro  阅读(85)  评论(0)    收藏  举报