Guest User

road repairment

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