Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.20 KB | None | 0 0
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6.  
  7. import java.io.BufferedReader;
  8. import java.io.IOException;
  9. import java.io.InputStreamReader;
  10. import java.util.ArrayList;
  11. import java.util.Iterator;
  12. import java.util.List;
  13. import java.util.StringTokenizer;
  14.  
  15. /**
  16. * NPM :1406649132 Nama : Fahmi Azizi
  17. *
  18. * @author user
  19. */
  20. public class SDA1415T2 {
  21.  
  22. public static void main(String[] args) throws IOException {
  23. AnaryTree anary = new AnaryTree();
  24. BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  25. int maxInput = Integer.parseInt(input.readLine());
  26.  
  27. for (int i = 0; i < maxInput; i++) {
  28. String line = input.readLine();
  29. StringTokenizer tokenizer = new StringTokenizer(line);
  30. if (tokenizer.hasMoreElements()) {
  31. if (line.toUpperCase().contains("TAMBAH")) {
  32. tokenizer.nextElement();
  33. String name = (String) tokenizer.nextElement();
  34. String phone = (String) tokenizer.nextElement();
  35. String regionalName = (String) tokenizer.nextElement();
  36. Node node = new Node(new Regional(name, phone), null);
  37. anary.insert(node, regionalName);
  38. } else if (line.toUpperCase().contains("HAPUS")) {
  39. tokenizer.nextElement();
  40. String regionalName = (String) tokenizer.nextElement();
  41. anary.remove(regionalName);
  42. } else if (line.toUpperCase().contains("TELEPON")) {
  43. tokenizer.nextElement();
  44. String regionalCaller = (String) tokenizer.nextElement();
  45. String regionalReceiver = (String) tokenizer.nextElement();
  46. if (regionalCaller.equals(regionalReceiver)) {
  47. } else {
  48. anary.call(regionalCaller, regionalReceiver);
  49. }
  50.  
  51. }
  52. }
  53. }
  54.  
  55. }
  56.  
  57. }
  58.  
  59. class Regional {
  60.  
  61. String name;
  62. String phone;
  63.  
  64. public Regional(String name, String phone) {
  65. this.name = name;
  66. this.phone = phone;
  67. }
  68.  
  69. public String getName() {
  70. return name;
  71. }
  72.  
  73. public void setName(String name) {
  74. this.name = name;
  75. }
  76.  
  77. public String getPhone() {
  78. return phone;
  79. }
  80.  
  81. public void setPhone(String phone) {
  82. this.phone = phone;
  83. }
  84.  
  85. }
  86.  
  87. class Node<T> {
  88.  
  89. private T element;
  90. private Node parent;
  91. private List<Node> listNode;
  92. private int level;
  93.  
  94. public Node(T element, Node parent) {
  95. this.element = element;
  96. this.parent = parent;
  97. listNode = new ArrayList<>();
  98. }
  99.  
  100. public Node(T element, Node parent, int level) {
  101. this.element = element;
  102. this.parent = parent;
  103. listNode = new ArrayList<>();
  104. this.level = level;
  105. }
  106.  
  107. public T getElement() {
  108. return element;
  109. }
  110.  
  111. public void setElement(T element) {
  112. this.element = element;
  113. }
  114.  
  115. public Node getParent() {
  116. return parent;
  117. }
  118.  
  119. public void setParent(Node parent) {
  120. this.parent = parent;
  121. }
  122.  
  123. public List<Node> getListNode() {
  124. return listNode;
  125. }
  126.  
  127. public int getLevel() {
  128. return level;
  129. }
  130.  
  131. public void setLevel(int level) {
  132. this.level = level;
  133. }
  134.  
  135. }
  136.  
  137. class AnaryTree<T> {
  138.  
  139. Node<T> root;
  140.  
  141. public AnaryTree() {
  142. this.root = null;
  143. }
  144.  
  145. void insert(Node node, String regionalName) {
  146. if (root == null) {
  147. node.setLevel(0);
  148. node.setParent(null);
  149. root = node;
  150. System.out.println("Kantor " + ((Regional) node.getElement()).getName() + " Berhasil dimasukkan");
  151. } else {
  152. if (((Regional) root.getElement()).getName().equals(regionalName)) {
  153. node.setLevel(root.getLevel() + 1);
  154. node.setParent(root);
  155. root.getListNode().add(node);
  156. System.out.println("Kantor " + ((Regional) node.getElement()).getName() + " Berhasil dimasukkan");
  157. } else {
  158. Node n = find(root, regionalName);
  159. if (n == null) {
  160. System.out.println("Kantor " + regionalName + " Tidak ditemukan");
  161. } else {
  162. node.setLevel(n.getLevel() + 1);
  163. node.setParent(n);
  164. n.getListNode().add(node);
  165. System.out.println("Kantor " + ((Regional) node.getElement()).getName() + " Berhasil dimasukkan");
  166. }
  167. }
  168. }
  169. }
  170.  
  171. Node find(Node node, String regionalName) {
  172. Node result = null;
  173. Iterator iterator = node.getListNode().iterator();
  174. while (iterator.hasNext()) {
  175. Node n = (Node) iterator.next();
  176. if (((Regional) n.getElement()).getName().equals(regionalName)) {
  177. result = n;
  178. if (result != null) {
  179. return result;
  180. }
  181. }
  182. if (n.getListNode().size() > 0) {
  183. result = find(n, regionalName);
  184. if (result != null) {
  185. return result;
  186. }
  187. }
  188. }
  189. return result;
  190. }
  191.  
  192. public void display(Node node) {
  193. Iterator iterator = node.getListNode().iterator();
  194. while (iterator.hasNext()) {
  195. Node n = (Node) iterator.next();
  196. if (n.getListNode().size() > 0) {
  197. display(n);
  198. }
  199. System.out.println(((Regional) n.getElement()).getName() + " - " + n.getLevel() + " - " + ((Regional) n.getParent().getElement()).getName());
  200.  
  201. }
  202. }
  203.  
  204. void remove(String regionalName) {
  205. Node node = find(root, regionalName);
  206. if (node == null) {
  207. System.out.println("Kantor " + regionalName + " Tidak ditemukan");
  208. return;
  209. } else {
  210. Node parent = node.getParent();
  211. if (parent != null) {
  212. if (node.getListNode().size() == 0) {
  213. parent.getListNode().remove(node);
  214. System.out.println("Hapus " + regionalName + " : Kantor " + regionalName + " Berhasil dihapus ");
  215. } else {
  216. List<Node> oldList = new ArrayList<>();
  217. oldList.addAll(node.getListNode());
  218. parent.getListNode().remove(node);
  219. System.out.println("Hapus " + regionalName + " : Kantor " + regionalName + " Berhasil dihapus ");
  220. Iterator iterator = oldList.iterator();
  221. while (iterator.hasNext()) {
  222. Node n = (Node) iterator.next();
  223. n.setLevel(n.getLevel() - 1);
  224. n.setParent(parent);
  225. System.out.println("Hapus " + regionalName + " : Kantor " + ((Regional) n.getElement()).getName() + " dipindahkan ");
  226. }
  227. parent.getListNode().addAll(oldList);
  228.  
  229. }
  230. }
  231.  
  232. }
  233. }
  234.  
  235. void call(String regionalCaller, String regionalReceiver) {
  236. Node caller, receiver;
  237. String rootRegional = ((Regional) root.getElement()).getName();
  238. List<Node> path1;
  239. List<Node> path2;
  240. if (rootRegional.equals(regionalCaller)) {
  241. caller = root;
  242. receiver = find(root, regionalReceiver);
  243. if (receiver != null) {
  244. path2 = generatePath(receiver);
  245.  
  246. if (path2.size() == 1) {
  247. String phone = ((Regional) path2.get(0).getElement()).getPhone();
  248. System.out.println("Telepon " + regionalCaller + " " + regionalReceiver + " : Nomor Telepon " + regionalReceiver + " adalah " + phone);
  249. } else {
  250. for (int i = path2.size() - 2; i >= 0; i--) {
  251. String phone = ((Regional) path2.get(i).getElement()).getPhone();
  252. if (i > 0) {
  253. String phoneDown = ((Regional) path2.get(i - 1).getElement()).getPhone();
  254. System.out.println("Telepon " + regionalCaller + " " + regionalReceiver + " : Telepon " + phone + " dapat " + phoneDown);
  255. } else {
  256. System.out.println("Telepon " + regionalCaller + " " + regionalReceiver + " : Nomor Telepon " + regionalReceiver + " adalah " + phone);
  257. }
  258. }
  259. }
  260. } else {
  261. System.out.println("Kantor " + regionalReceiver + " Tidak ditemukan ");
  262. }
  263.  
  264. } else if (rootRegional.equals(regionalReceiver)) {
  265. receiver = root;
  266. caller = find(root, regionalCaller);
  267. if (caller != null) {
  268. path1 = generatePath(caller);
  269. for (int i = 0; i < path1.size(); i++) {
  270. String phone = ((Regional) path1.get(i).getElement()).getPhone();
  271. if (path1.size() == 1) {
  272. System.out.println("Telepon " + regionalCaller + " " + regionalReceiver + " : Nomor Telepon " + regionalReceiver + " adalah " + phone);
  273. break;
  274. }
  275. if (i < path1.size() - 1) {
  276. String phoneParent = ((Regional) path1.get(i).getParent().getElement()).getPhone();
  277. System.out.println("Telepon " + regionalCaller + " " + regionalReceiver + " : Telepon " + phone + " dapat " + phoneParent);
  278. } else {
  279. System.out.println("Telepon " + regionalCaller + " " + regionalReceiver + " : Nomor Telepon " + regionalReceiver + " adalah " + phone);
  280. }
  281. }
  282.  
  283. } else {
  284. System.out.println("Kantor " + regionalCaller + " Tidak ditemukan ");
  285. }
  286. } else {
  287. caller = find(root, regionalCaller);
  288. receiver = find(root, regionalReceiver);
  289. if (receiver == null) {
  290. System.out.println("Kantor " + regionalCaller + " Tidak ditemukan ");
  291. }
  292. if (caller == null) {
  293. System.out.println("Kantor " + regionalReceiver + " Tidak ditemukan ");
  294. }
  295. if (caller != null && receiver != null) {
  296. path1 = generatePath(caller);
  297. path2 = generatePath(receiver);
  298. int index = getIndexForSamePath(path1, path2);
  299.  
  300. }
  301. }
  302. }
  303.  
  304. int getIndexForSamePath(List<Node> path1, List<Node> path2) {
  305. int result = 0;
  306. if (path1.size() > path2.size()) {
  307. for (int i = path2.size()-1; i >=0 ; i++) {
  308. String regional1 = ((Regional) path1.get(i).getElement()).getName();
  309. String regional2 = ((Regional) path2.get(i).getElement()).getName();
  310. if (!regional1.equals(regional2)) {
  311. result = i + 1;
  312. break;
  313. }
  314. }
  315. } else {
  316. for (int i = path1.size()-1; i >=0; i++) {
  317. String regional1 = ((Regional) path1.get(i).getElement()).getName();
  318. String regional2 = ((Regional) path2.get(i).getElement()).getName();
  319. if (!regional1.equals(regional2)) {
  320. result = i + 1;
  321. break;
  322. }
  323. }
  324. }
  325. System.out.println(result);
  326. return result;
  327.  
  328. }
  329.  
  330. List<Node> generatePath(Node node) {
  331. List<Node> result = new ArrayList<>();
  332. System.out.println("Pathnya " + ((Regional) node.getElement()).getName() + " :");
  333. while (node.getParent() != null) {
  334. result.add(node.getParent());
  335. node = node.getParent();
  336. System.out.print(((Regional) node.getElement()).getName() + " - ");
  337. }
  338. System.out.println("");
  339. return result;
  340. }
  341.  
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement