Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.io.*;
- class BNode<E> {
- public E info;
- public BNode<E> left;
- public BNode<E> right;
- static int LEFT = 1;
- static int RIGHT = 2;
- public BNode(E info) {
- this.info = info;
- left = null;
- right = null;
- }
- public BNode() {
- this.info = null;
- left = null;
- right = null;
- }
- public BNode(E info, BNode<E> left, BNode<E> right) {
- this.info = info;
- this.left = left;
- this.right = right;
- }
- }
- class BTree<E> {
- public BNode<E> root;
- public BTree() {
- root = null;
- }
- public BTree(E info) {
- root = new BNode<E>(info);
- }
- public void makeRoot(E elem) {
- root = new BNode(elem);
- }
- public void makeRootNode(BNode<E> node) {
- root = node;
- }
- public BNode<E> addChild(BNode<E> node, int where, E elem) {
- BNode<E> tmp = new BNode<E>(elem);
- if (where == BNode.LEFT) {
- if (node.left != null) // veke postoi element
- return null;
- node.left = tmp;
- } else {
- if (node.right != null) // veke postoi element
- return null;
- node.right = tmp;
- }
- return tmp;
- }
- public BNode<E> addChildNode(BNode<E> node, int where, BNode<E> tmp) {
- if (where == BNode.LEFT) {
- if (node.left != null) // veke postoi element
- return null;
- node.left = tmp;
- } else {
- if (node.right != null) // veke postoi element
- return null;
- node.right = tmp;
- }
- return tmp;
- }
- public BNode<E> korenNaDvata(BNode<E> od, BNode<E> doo){
- return korenNaDvata(root,od,doo);
- }
- public BNode<E> korenNaDvata(BNode<E> node, BNode<E> od, BNode<E> doo){
- if(node==null)
- return null;
- if(node==od||node==doo)
- return node;
- BNode<E> left = korenNaDvata(node.left,od,doo);
- BNode<E> right = korenNaDvata(node.right,od,doo);
- if(left!=null&&right!=null)
- return node;
- if(left!=null)
- return left;
- return right;
- }
- public BNode<E> find(BNode<E> node,String najdi){
- if(node==null)
- return null;
- if(node.info.equals(najdi))
- return node;
- else {
- BNode<E> left = find(node.left,najdi);
- BNode<E> right = find(node.right,najdi);
- if(left!=null)
- return left;
- return right;
- }
- }
- public int najkratkaPateka(BNode<String> koren2, BNode<String> node,int brojac) {
- if(koren2 ==null)
- return 999999;
- if(koren2==node)
- return 0;
- brojac+=Math.min(najkratkaPateka(koren2.left, node,brojac)+1,najkratkaPateka(koren2.right,node,brojac)+1);
- return brojac;
- }
- }
- public class NodeDistance {
- public static void main(String[] args) throws IOException, Exception {
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- int n = Integer.parseInt(br.readLine());
- StringTokenizer st;
- BNode<String> [] nodes = new BNode[n];
- BTree<String> tree = new BTree<String>();
- for(int i=0;i<n;i++)
- nodes[i] = new BNode<String>();
- for(int i=0;i<n;i++) {
- String line = br.readLine();
- st = new StringTokenizer(line);
- int index = Integer.parseInt(st.nextToken());
- nodes[index].info = st.nextToken();
- String action = st.nextToken();
- if(action.equals("RIGHT")) {
- tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.RIGHT, nodes[index]);
- }
- else if(action.equals("LEFT")) {
- tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.LEFT, nodes[index]);
- }
- else {
- tree.makeRootNode(nodes[index]);
- }
- }
- int kolku = Integer.parseInt(br.readLine());
- for(int i=0;i<kolku;i++) {
- String [] dva = br.readLine().split(" ");
- String od = dva[0];
- String doo = dva[1];
- BNode<String> getfirst = tree.find(tree.root, od);
- BNode<String> getsecond = tree.find(tree.root,doo);
- if(getfirst==null||getsecond==null)
- {
- System.out.println("ERROR");
- continue;
- }
- BNode<String> koren2 = tree.korenNaDvata(getfirst, getsecond);
- int prv = (tree.najkratkaPateka(koren2,getfirst,0));
- int vtor = (tree.najkratkaPateka(koren2,getsecond,0));
- System.out.println((prv+vtor)*2);
- }
- }
- }
Add Comment
Please, Sign In to add comment