Guest User

Petya and Repairment of Roads

a guest
Apr 25th, 2018
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.80 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.Arrays;
  5. import java.util.Comparator;
  6. import java.util.HashSet;
  7.  
  8. import static java.lang.Integer.parseInt;
  9.  
  10. class PetyaAndRepairmentOfRoads {
  11.     static int edges[][] = new int[200001][3];
  12.     static int parent[] = new int[100001];
  13.     static boolean milkMen[] = new boolean[100001];
  14.     public static void main(String[] args) throws IOException {
  15.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  16.         int n, m, source, t, p;
  17.         String s[];
  18.         t = parseInt(br.readLine());
  19.         while (t-- > 0) {
  20.             s = br.readLine().split("\\s");
  21.             n = parseInt(s[0]);
  22.             m = parseInt(s[1]);
  23.             s = br.readLine().split("\\s");
  24.             for (int i = 1; i <= n; i++) {
  25.                 if ("1".equals(s[i - 1])) {
  26.                     milkMen[i] = true;
  27.                 }
  28.             }
  29.             for (int i = 0; i < m; i++) {
  30.                 s = br.readLine().split("\\s");
  31.                 edges[i][0] = parseInt(s[0]);
  32.                 edges[i][1] = parseInt(s[1]);
  33.                 edges[i][2] = parseInt(s[2]);
  34.                 if (milkMen[edges[i][0]] && milkMen[edges[i][1]]) {
  35.                     edges[i][2] = 0;
  36.                 }
  37.             }
  38.             System.out.println(solve(n, m));
  39.         }
  40.     }
  41.  
  42.     private static String solve(int n, int m) {
  43.         HashSet<Integer> nonMilkmenConnectedCities = new HashSet<>();
  44.         Arrays.sort(edges, 0, m, Comparator.comparingInt(o -> o[2]));
  45.         for (int i = 1; i <=n; i++) {
  46.             parent[i] = i;
  47.             nonMilkmenConnectedCities.add(i);
  48.         }
  49.         long ans = 0;
  50.         for (int i = 0; i < m; i++) {
  51.             int u = edges[i][0];
  52.             int v = edges[i][1];
  53.             if (findSet(u) != findSet(v)) {
  54.                 ans += edges[i][2];
  55.                 findUnion(u, v,nonMilkmenConnectedCities);
  56.             }
  57.         }
  58.         for (int i = 1; i <= n; i++) {
  59.             findSet(i);
  60.             if (milkMen[parent[i]]) {
  61.                 nonMilkmenConnectedCities.remove(i);
  62.             }
  63.         }
  64.         if (nonMilkmenConnectedCities.size() > 0) {
  65.             return "impossible";
  66.         }
  67.  
  68.         return ans + "";
  69.     }
  70.  
  71.     private static void findUnion(int u, int v, HashSet<Integer> nonMilkmenConnectedCities) {
  72.  
  73.         if (milkMen[u]) {
  74.             parent[findSet(v)] = findSet(u);
  75.         } else {
  76.             parent[findSet(u)] = findSet(v);
  77.         }
  78.     }
  79.  
  80.     private static int findSet(int x) {
  81.  
  82.         if (x != parent[x]) {
  83.             parent[x] = findSet(parent[x]);
  84.         }
  85.         return parent[x];
  86.     }
  87.  
  88. }
  89. /*
  90. 1
  91. 5 7
  92. 0 1 0 1 0
  93. 1 2 11
  94. 1 3 1
  95. 1 5 17
  96. 2 3 1
  97. 3 5 18
  98. 4 5 3
  99. 2 4 5
  100. */
Add Comment
Please, Sign In to add comment