Go to diff to previous submission
import java.util.*; import java.io.*; class Fr { while(br.ready()) { doTestCase(br, numNodes, centralNode); } } public static void doTestCase(BufferedReader br, int numNodes, int centralNode) throws IOException { Node[] nodes = new Node[numNodes]; for (int i = 1; i <= nodes.length; i++) { nodes[i- 1] = new Node(i, i == centralNode); } for (int i = 0; i < (numNodes - 1); i++) { // pipes Pipe p = new Pipe(effort, nodeA, nodeB); nodeA.addPipe(p); nodeB.addPipe(p); } /*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()); }*/ } } class Node { protected int id; boolean root; ArrayList<Pipe> pipes = new ArrayList<Pipe>(); 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; } return id; } //effort to remove ME public int getEffort(ArrayList<Integer> visitedNodes) { visitedNodes.add(id); //System.out.printf("GetEffort of node %d\n", id); 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; 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; } } } /*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 int getEffort() { return effort; } public Node getNodeA() { return a; } public Node getNodeB() { return b; } @Override return "Pipe "+a.getId()+"<->"+b.getId(); } }
--- 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