Source code for submission s892

Go to diff to previous submission

Fr.java

  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. class Fr
  5. {
  6.  
  7. public static void main(String[] args) throws IOException {
  8.  
  9.  
  10. while(br.ready())
  11. {
  12. String line = br.readLine();
  13. int numNodes = Integer.parseInt(st.nextToken());
  14. int centralNode = Integer.parseInt(st.nextToken());
  15. doTestCase(br, numNodes, centralNode);
  16.  
  17. }
  18. }
  19.  
  20. public static void doTestCase(BufferedReader br, int numNodes, int centralNode) throws IOException {
  21. Node[] nodes = new Node[numNodes];
  22. for (int i = 1; i <= nodes.length; i++) {
  23. nodes[i- 1] = new Node(i, i == centralNode);
  24.  
  25. }
  26.  
  27.  
  28.  
  29.  
  30. for (int i = 0; i < (numNodes - 1); i++) { // pipes
  31. String line = br.readLine();
  32. Node nodeA = nodes[Integer.parseInt(st.nextToken()) - 1];
  33. Node nodeB = nodes[Integer.parseInt(st.nextToken()) - 1];
  34. int effort = Integer.parseInt(st.nextToken());
  35.  
  36. Pipe p = new Pipe(effort, nodeA, nodeB);
  37. nodeA.addPipe(p);
  38. nodeB.addPipe(p);
  39.  
  40. }
  41.  
  42. System.out.println(nodes[centralNode - 1].getEffort(new ArrayList<Integer>()));
  43.  
  44. /*for (int i = 0; i < nodes.length; i++) {
  45.   HubNode hubNode = nodes[i];
  46.   // System.out.println("node #"+(i+1)+", "+hubNode.getChildren().size()+" children, effort = "+hubNode.getEffort());
  47.  
  48.   }*/
  49.  
  50.  
  51. }
  52.  
  53.  
  54.  
  55.  
  56. }
  57.  
  58.  
  59. class Node {
  60.  
  61. protected int id;
  62. boolean root;
  63. ArrayList<Pipe> pipes = new ArrayList<Pipe>();
  64.  
  65.  
  66. public Node(int id, boolean root) {
  67. this.id = id;
  68. this.root = root;
  69. }
  70.  
  71. public void addPipe(Pipe pipe) {
  72. //System.out.printf("Add pipe to node %d, %s\n", id, pipe);
  73. pipes.add(pipe);
  74. }
  75.  
  76. public ArrayList<Pipe> getPipes() {
  77. return pipes;
  78. }
  79.  
  80. public Integer getId() {
  81. return id;
  82. }
  83.  
  84. //effort to remove ME
  85. public int getEffort(ArrayList<Integer> visitedNodes) {
  86. visitedNodes.add(id);
  87.  
  88. //System.out.printf("GetEffort of node %d\n", id);
  89.  
  90. int removeMeEffort;
  91. //nalezt rodicovskou pipu
  92.  
  93. if(!root) {
  94. Pipe parentPipe = null;
  95.  
  96. for(Pipe p : getPipes()) {
  97. //System.out.println(p);
  98. if(visitedNodes.contains(p.getNodeA().getId()) ||
  99. visitedNodes.contains(p.getNodeB().getId())) {
  100. parentPipe = p;
  101. break;
  102. }
  103. }
  104.  
  105. removeMeEffort = parentPipe.getEffort();
  106. }else {
  107.  
  108. removeMeEffort = -1;
  109.  
  110. }
  111. int removeChildrenEffort = 0;
  112.  
  113.  
  114.  
  115. if(pipes.size() == 1) { //list
  116. return pipes.get(0).getEffort();
  117.  
  118. }else { //hubovej uzel
  119.  
  120. for(Pipe p : getPipes()) { //prohlidnu kazou pipu
  121. Node a = p.getNodeA();
  122. Node b = p.getNodeB();
  123.  
  124. if(visitedNodes.contains(a.getId()) &&
  125. visitedNodes.contains(b.getId())) {
  126. //pokud mne spojuje s nodem kde jsem uz byl, ignoruju
  127. continue;
  128.  
  129. }else {
  130. Node child = a.getId() == id ? b : a;
  131. removeChildrenEffort += child.getEffort(visitedNodes);
  132. }
  133. }
  134.  
  135. }
  136.  
  137. if(root) {
  138. return removeChildrenEffort;
  139. }else {
  140. return removeMeEffort > removeChildrenEffort ? removeChildrenEffort : removeMeEffort;
  141. }
  142. }
  143.  
  144. }
  145.  
  146. /*class RootNode extends HubNode {
  147. }*/
  148.  
  149. class Pipe {
  150. protected int effort;
  151. protected Node a, b;
  152.  
  153. ArrayList<Integer> visitedNodes = new ArrayList<Integer>();
  154.  
  155. public Pipe(int effort, Node a, Node b) {
  156. this.effort = effort;
  157. this.a = a;
  158. this.b = b;
  159. }
  160.  
  161. public int getEffort() {
  162. return effort;
  163. }
  164.  
  165. public Node getNodeA() {
  166. return a;
  167. }
  168.  
  169. public Node getNodeB() {
  170. return b;
  171. }
  172.  
  173. @Override
  174. public String toString() {
  175. return "Pipe "+a.getId()+"<->"+b.getId();
  176. }
  177. }

Diff to submission s717

Fr.java

--- c5.s717.cteam006.fr.java.0.Fr.java
+++ c5.s892.cteam006.fr.java.0.Fr.java
@@ -21,50 +21,33 @@
     
     public static void doTestCase(BufferedReader br, int numNodes, int centralNode) throws IOException {
-        HubNode[] nodes = new HubNode[numNodes];
-        for (int i = 0; i < nodes.length; i++) {
-            nodes[i] = new HubNode();
+        Node[] nodes = new Node[numNodes];
+        for (int i = 1; i <= nodes.length; i++) {
+            nodes[i- 1] = new Node(i, i == centralNode);
 
         }
         
-        nodes[centralNode - 1].setCentral();
 
         
         
-        for (int i = 0; i < (numNodes - 1); i++) {
+        for (int i = 0; i < (numNodes - 1); i++) { // pipes
             String line = br.readLine();
             StringTokenizer st = new StringTokenizer(line);
-            int nodeA = Integer.parseInt(st.nextToken());
-            int nodeB = Integer.parseInt(st.nextToken());
+            Node nodeA = nodes[Integer.parseInt(st.nextToken()) - 1];
+            Node nodeB = nodes[Integer.parseInt(st.nextToken()) - 1];
             int effort = Integer.parseInt(st.nextToken());
             
-            if(nodeA == centralNode || nodeB == centralNode) { //jeden z nich je central
-                if(nodeA == centralNode) {
-                    nodes[nodeA - 1].addChild(nodes[nodeB - 1]);
-                    nodes[nodeB - 1].setEffort(effort);
-                    
-                }else {
-                    nodes[nodeB - 1].addChild(nodes[nodeA - 1]);
-                    nodes[nodeA - 1].setEffort(effort);
-                }
-            }else { //ani jeden
-                if(!nodes[nodeA - 1].hasSetEffort()) { //na tenhle jsem jeste nenastavil effort
-                    nodes[nodeA - 1].setEffort(effort);
-                    nodes[nodeB - 1].addChild(nodes[nodeA - 1]);
-                }else {
-                    nodes[nodeB - 1].setEffort(effort);
-                    nodes[nodeA - 1].addChild(nodes[nodeB - 1]);
-                }
-                                
-            }
+            Pipe p = new Pipe(effort, nodeA, nodeB);
+            nodeA.addPipe(p);
+            nodeB.addPipe(p);
 
         }
         
-        System.out.println(nodes[centralNode - 1].getEffort());
+        System.out.println(nodes[centralNode - 1].getEffort(new ArrayList<Integer>()));
         
-        for (int i = 0; i < nodes.length; i++) {
+        /*for (int i = 0; i < nodes.length; i++) {
             HubNode hubNode = nodes[i];
          //   System.out.println("node #"+(i+1)+", "+hubNode.getChildren().size()+" children, effort = "+hubNode.getEffort());
 
-        }
+        }*/
 
 
@@ -77,48 +60,121 @@
 
 
-class HubNode {
+class Node {
     
-    protected int effort = 0;
-    protected boolean setEffort = false;
-    protected boolean central = false;
-    protected ArrayList<HubNode> children = new ArrayList<HubNode>();
+    protected int id;
+    boolean root;
+    ArrayList<Pipe> pipes = new ArrayList<Pipe>();
     
-    public int getEffort() {
+    
+    public Node(int id, boolean root) {
+        this.id = id;
+        this.root = root;
+    }
+    
+    public void addPipe(Pipe pipe) {
+        //System.out.printf("Add pipe to node %d, %s\n", id, pipe);
+        pipes.add(pipe);
+    }
+    
+    public ArrayList<Pipe> getPipes() {
+        return pipes;
+    }
+    
+    public Integer getId() {
+        return id;
+    }
+    
+    //effort to remove ME
+    public int getEffort(ArrayList<Integer> visitedNodes) {       
+        visitedNodes.add(id);
         
-        if(children.size() == 0) {// System.out.println("getChildren == 0");
-            //koncovej uzel
-            return effort;
-        }
+        //System.out.printf("GetEffort of node %d\n", id);
         
-        int childEffort = 0;
-        for(HubNode n : getChildren()) {
-            childEffort += n.getEffort();
+        int removeMeEffort;
+        //nalezt rodicovskou pipu
+        
+        if(!root) {
+            Pipe parentPipe = null;
+        
+            for(Pipe p : getPipes()) {
+                //System.out.println(p);
+                if(visitedNodes.contains(p.getNodeA().getId()) || 
+                        visitedNodes.contains(p.getNodeB().getId())) {
+                    parentPipe = p;
+                    break;
+                }
+            }
+            
+            removeMeEffort = parentPipe.getEffort();
+        }else {
+            
+            removeMeEffort = -1;
+            
         }
+        int removeChildrenEffort = 0;
+        
         
-        return (effort > childEffort || central) ? childEffort : effort;
         
+        if(pipes.size() == 1) { //list
+            return pipes.get(0).getEffort();
+            
+        }else { //hubovej uzel
+            
+            for(Pipe p : getPipes()) { //prohlidnu kazou pipu
+                Node a = p.getNodeA();
+                Node b = p.getNodeB();
+                
+                if(visitedNodes.contains(a.getId()) &&
+                        visitedNodes.contains(b.getId())) {
+                    //pokud mne spojuje s nodem kde jsem uz byl, ignoruju
+                    continue;
+                    
+                }else {
+                    Node child = a.getId() == id ? b : a;       
+                    removeChildrenEffort += child.getEffort(visitedNodes);                  
+                }         
+            }
+            
+        }
         
+        if(root) {
+            return removeChildrenEffort;
+        }else {
+            return removeMeEffort > removeChildrenEffort ? removeChildrenEffort : removeMeEffort;
+        }
     }
     
-    void setCentral() {
-        central = true;
+}
+
+/*class RootNode extends HubNode {
+}*/
+
+class Pipe {
+    protected int effort;
+    protected Node a, b;
+    
+    ArrayList<Integer> visitedNodes = new ArrayList<Integer>();
+    
+    public Pipe(int effort, Node a, Node b) {
+        this.effort = effort;
+        this.a = a;
+        this.b = b;
     }
     
-    public boolean hasSetEffort() {
-        return setEffort;
+    public int getEffort() {
+        return effort;
     }
     
-    public void setEffort(int effort) {
-        setEffort = true;
-        this.effort = effort;
+    public Node getNodeA() {
+        return a;
     }
     
-    public ArrayList<HubNode> getChildren() {
-        return children;
+    public Node getNodeB() {
+        return b;
     }
     
-    public void addChild(HubNode child) {
-       // System.out.println("Adding child ");
-        children.add(child);
+    @Override
+    public String toString() {
+        return "Pipe "+a.getId()+"<->"+b.getId();
     }
 }
\ No newline at end of file