SashkoKlincharov

[Java][АПС] - Растојание во дрво

Feb 6th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.52 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4.  
  5. class BNode<E> {
  6.  
  7. public E info;
  8. public BNode<E> left;
  9. public BNode<E> right;
  10.  
  11. static int LEFT = 1;
  12. static int RIGHT = 2;
  13.  
  14. public BNode(E info) {
  15. this.info = info;
  16. left = null;
  17. right = null;
  18. }
  19.  
  20. public BNode() {
  21. this.info = null;
  22. left = null;
  23. right = null;
  24. }
  25.  
  26. public BNode(E info, BNode<E> left, BNode<E> right) {
  27. this.info = info;
  28. this.left = left;
  29. this.right = right;
  30. }
  31.  
  32. }
  33.  
  34. class BTree<E> {
  35.  
  36. public BNode<E> root;
  37.  
  38. public BTree() {
  39. root = null;
  40. }
  41.  
  42. public BTree(E info) {
  43. root = new BNode<E>(info);
  44. }
  45.  
  46. public void makeRoot(E elem) {
  47. root = new BNode(elem);
  48. }
  49.  
  50. public void makeRootNode(BNode<E> node) {
  51. root = node;
  52. }
  53.  
  54. public BNode<E> addChild(BNode<E> node, int where, E elem) {
  55.  
  56. BNode<E> tmp = new BNode<E>(elem);
  57.  
  58. if (where == BNode.LEFT) {
  59. if (node.left != null) // veke postoi element
  60. return null;
  61. node.left = tmp;
  62. } else {
  63. if (node.right != null) // veke postoi element
  64. return null;
  65. node.right = tmp;
  66. }
  67.  
  68. return tmp;
  69. }
  70.  
  71. public BNode<E> addChildNode(BNode<E> node, int where, BNode<E> tmp) {
  72.  
  73. if (where == BNode.LEFT) {
  74. if (node.left != null) // veke postoi element
  75. return null;
  76. node.left = tmp;
  77. } else {
  78. if (node.right != null) // veke postoi element
  79. return null;
  80. node.right = tmp;
  81. }
  82.  
  83. return tmp;
  84. }
  85. public BNode<E> korenNaDvata(BNode<E> od, BNode<E> doo){
  86. return korenNaDvata(root,od,doo);
  87. }
  88. public BNode<E> korenNaDvata(BNode<E> node, BNode<E> od, BNode<E> doo){
  89. if(node==null)
  90. return null;
  91. if(node==od||node==doo)
  92. return node;
  93. BNode<E> left = korenNaDvata(node.left,od,doo);
  94. BNode<E> right = korenNaDvata(node.right,od,doo);
  95.  
  96. if(left!=null&&right!=null)
  97. return node;
  98. if(left!=null)
  99. return left;
  100. return right;
  101. }
  102.  
  103. public BNode<E> find(BNode<E> node,String najdi){
  104. if(node==null)
  105. return null;
  106. if(node.info.equals(najdi))
  107. return node;
  108. else {
  109. BNode<E> left = find(node.left,najdi);
  110. BNode<E> right = find(node.right,najdi);
  111. if(left!=null)
  112. return left;
  113. return right;
  114. }
  115.  
  116. }
  117.  
  118. public int najkratkaPateka(BNode<String> koren2, BNode<String> node,int brojac) {
  119. if(koren2 ==null)
  120. return 999999;
  121. if(koren2==node)
  122. return 0;
  123. brojac+=Math.min(najkratkaPateka(koren2.left, node,brojac)+1,najkratkaPateka(koren2.right,node,brojac)+1);
  124. return brojac;
  125. }
  126. }
  127.  
  128. public class NodeDistance {
  129.  
  130. public static void main(String[] args) throws IOException, Exception {
  131. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  132. int n = Integer.parseInt(br.readLine());
  133. StringTokenizer st;
  134.  
  135. BNode<String> [] nodes = new BNode[n];
  136. BTree<String> tree = new BTree<String>();
  137. for(int i=0;i<n;i++)
  138. nodes[i] = new BNode<String>();
  139.  
  140. for(int i=0;i<n;i++) {
  141. String line = br.readLine();
  142. st = new StringTokenizer(line);
  143. int index = Integer.parseInt(st.nextToken());
  144. nodes[index].info = st.nextToken();
  145. String action = st.nextToken();
  146. if(action.equals("RIGHT")) {
  147. tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.RIGHT, nodes[index]);
  148. }
  149. else if(action.equals("LEFT")) {
  150. tree.addChildNode(nodes[Integer.parseInt(st.nextToken())], BNode.LEFT, nodes[index]);
  151. }
  152. else {
  153. tree.makeRootNode(nodes[index]);
  154. }
  155. }
  156. int kolku = Integer.parseInt(br.readLine());
  157. for(int i=0;i<kolku;i++) {
  158. String [] dva = br.readLine().split(" ");
  159. String od = dva[0];
  160. String doo = dva[1];
  161.  
  162. BNode<String> getfirst = tree.find(tree.root, od);
  163. BNode<String> getsecond = tree.find(tree.root,doo);
  164. if(getfirst==null||getsecond==null)
  165. {
  166. System.out.println("ERROR");
  167. continue;
  168.  
  169. }
  170.  
  171.  
  172. BNode<String> koren2 = tree.korenNaDvata(getfirst, getsecond);
  173.  
  174. int prv = (tree.najkratkaPateka(koren2,getfirst,0));
  175. int vtor = (tree.najkratkaPateka(koren2,getsecond,0));
  176. System.out.println((prv+vtor)*2);
  177. }
  178.  
  179.  
  180. }
  181.  
  182. }
Add Comment
Please, Sign In to add comment