fork download
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayDeque;
  5. import java.util.ArrayList;
  6. import java.util.Deque;
  7.  
  8. public class Main {
  9. private final RoomNode[] rooms;
  10. private final int passages;
  11.  
  12. private long noOfPairsWhichHaveDraughts = 0;
  13. private long noOfRoomsWithAtleastOneDraught = 0;
  14.  
  15. public Main(BufferedReader in) throws Exception {
  16.  
  17. String[] roomAndPassage = in.readLine().split(" ");
  18. int noOfRooms = Integer.parseInt(roomAndPassage[0]);
  19. if (noOfRooms > 50000) {noOfRooms = 50000;}
  20. passages = Integer.parseInt(roomAndPassage[1]);
  21.  
  22. rooms = new RoomNode[noOfRooms];
  23.  
  24. setRoomsWithOpenWindows(in);
  25. setPairsWithDraughts(in);
  26. findSolution();
  27. }
  28.  
  29.  
  30. private void setRoomsWithOpenWindows(BufferedReader in) throws IOException, Exception {
  31.  
  32. int i = 0;
  33. String[] line = in.readLine().trim().split(" ");
  34.  
  35. for (String roomToken : line) {
  36. boolean openWindow = Integer.parseInt(roomToken) == 1? true:false;
  37. rooms[i] = new RoomNode(openWindow);
  38. i++;
  39. if (i>=rooms.length) {break;}
  40. }
  41. }
  42.  
  43.  
  44. private void setPairsWithDraughts(BufferedReader in) throws NumberFormatException, IOException, Exception {
  45.  
  46. String line = null;
  47. int i = 0;
  48. while((line = in.readLine()) != null && !line.isEmpty() & i <= passages) {
  49. line = line.trim();
  50. String[] lineTokens = line.split(" ");
  51. RoomNode room1 = rooms[Integer.parseInt(lineTokens[0])-1];
  52. RoomNode room2 = rooms[Integer.parseInt(lineTokens[1])-1];
  53. room1.addLinks(room2);
  54. room2.setParent(room1);
  55. i++;
  56. }
  57. }
  58.  
  59.  
  60. private void findSolution() {
  61.  
  62. Deque<RoomNode> stack = new ArrayDeque<>();
  63. int pruned = 0;
  64. int openCount = 0;
  65.  
  66. for (RoomNode room: rooms) {
  67. pruned += pruneTree(room);
  68. if (room.isVisited() || !room.isOpenWindow()) {continue;}
  69. stack.clear();
  70. stack.push(room);
  71.  
  72. while(!stack.isEmpty()) {
  73. RoomNode node = stack.pop();
  74. node.setVisited(true);
  75. if (node.isOpenWindow()) {openCount++;}
  76. stack.addAll(node.getLinks());
  77. }
  78. }
  79. if (openCount > 1) {
  80. noOfPairsWhichHaveDraughts += ((openCount * (openCount-1))/2);
  81. noOfRoomsWithAtleastOneDraught = rooms.length - pruned;
  82. }
  83. }
  84.  
  85.  
  86. private int pruneTree(RoomNode room) {
  87.  
  88. Deque<RoomNode> stack = new ArrayDeque<>();
  89. int pruned = 0;
  90.  
  91. if (room.isOpenWindow()) {return 0;}
  92. stack.push(room);
  93. while(!stack.isEmpty()) {
  94. RoomNode node = stack.pop();
  95. if (!node.isOpenWindow() && node.getLinks().isEmpty()) {
  96. pruned++;
  97. node.parent.getLinks().remove(node);
  98. stack.push(node.getParent());
  99. }
  100. }
  101. return pruned;
  102. }
  103.  
  104.  
  105. public String getSolution() {
  106. return noOfPairsWhichHaveDraughts + " " + noOfRoomsWithAtleastOneDraught;
  107. }
  108.  
  109.  
  110. public static void main(String[] args) {
  111. Main draughts;
  112. draughts = new Main(in);
  113. System.out.println(draughts.getSolution());
  114. } catch (Exception e) {
  115. e.printStackTrace();
  116. }
  117. System.exit(0);
  118. }
  119.  
  120.  
  121. private class RoomNode {
  122.  
  123. private final boolean openWindow;
  124. private final ArrayList<RoomNode> links = new ArrayList<>();
  125. private RoomNode parent;
  126. private boolean visited;
  127.  
  128. public RoomNode (boolean openWindow) {
  129.  
  130. this.openWindow = openWindow;
  131. visited = false;
  132. setParent(null);
  133. }
  134.  
  135. public boolean isOpenWindow() {
  136. return openWindow;
  137. }
  138.  
  139. public void addLinks(RoomNode link) {
  140. links.add(link);
  141. }
  142.  
  143. public ArrayList<RoomNode> getLinks() {
  144. return links;
  145. }
  146.  
  147. public boolean isVisited() {
  148. return visited;
  149. }
  150.  
  151. public void setVisited(boolean visited) {
  152. this.visited = visited;
  153. }
  154.  
  155. public RoomNode getParent() {
  156. return parent;
  157. }
  158.  
  159. public void setParent(RoomNode parent) {
  160. this.parent = parent;
  161. }
  162. }
  163. }
Success #stdin #stdout #stderr 0.08s 380160KB
stdin
6 3
1 0 1 0 1 0
1 2
3 4
4 1

stdout
Standard output is empty
stderr
java.lang.NullPointerException
	at Main.pruneTree(Main.java:97)
	at Main.findSolution(Main.java:67)
	at Main.<init>(Main.java:26)
	at Main.main(Main.java:113)
	Suppressed: java.io.IOException: Permission denied
		at java.io.FileInputStream.close0(Native Method)
		at java.io.FileInputStream.close(FileInputStream.java:326)
		at java.io.BufferedInputStream.close(BufferedInputStream.java:472)
		at sun.nio.cs.StreamDecoder.implClose(StreamDecoder.java:377)
		at sun.nio.cs.StreamDecoder.close(StreamDecoder.java:192)
		at java.io.InputStreamReader.close(InputStreamReader.java:199)
		at java.io.BufferedReader.close(BufferedReader.java:517)
		at Main.main(Main.java:115)