Tarango

3 types

Jul 29th, 2015
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. //============================================================================
  2. // Name        : ACM
  3. // Author      : Tarango Khan
  4. // Team        : BRACU Byteheads
  5. //============================================================================
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define Size 100000005
  10. #define Mod 1000000007
  11.  
  12. struct edge {
  13.     int u;
  14.     int v;
  15.     int w;
  16. };
  17.  
  18. bool cmp(edge a, edge b) {
  19.     if (a.w == 3) return true;
  20.     return false;
  21. }
  22.  
  23. int N, M;
  24. edge A[10005];
  25. int men[1005];
  26. int women[1005];
  27.  
  28. int get_parent_men(int u) {
  29.     if (men[u] == u) return u;
  30.     return men[u] = get_parent_men(men[u]);
  31. }
  32.  
  33. int get_parent_women(int u) {
  34.     if (women[u] == u) return u;
  35.     return women[u] = get_parent_women(women[u]);
  36. }
  37.  
  38. int mst() {
  39.     for (int i = 0; i <= N; i++) {
  40.         men[i] = women[i] = i;
  41.     }
  42.     sort(A, A + M, cmp);
  43.     int taken = 0, m = 0, w = 0;
  44.     for (int i = 0; i < M; i++) {
  45.         if (A[i].w == 3) {
  46.             int pu = get_parent_men(A[i].u);
  47.             int pv = get_parent_men(A[i].v);
  48.             if ((pu == pv) || (m >= N - 1 && w >= N - 1)) {
  49.                 taken++;
  50.             } else {
  51.                 men[pu] = pv;
  52.                 women[pu] = pv;
  53.                 w++;
  54.                 m++;
  55.             }
  56.         }
  57.     }
  58.     for (int i = 0; i < M; i++) {
  59.         if (A[i].w == 1) {
  60.             int pu = get_parent_men(A[i].u);
  61.             int pv = get_parent_men(A[i].v);
  62.             if (pu != pv && m < N - 1) {
  63.                 men[pu] = pv;
  64.                 m++;
  65.             } else {
  66.                 taken++;
  67.             }
  68.         }
  69.     }
  70.     for (int i = 0; i < M; i++) {
  71.         if (A[i].w == 2) {
  72.             int pu = get_parent_women(A[i].u);
  73.             int pv = get_parent_women(A[i].v);
  74.             if (pu != pv && w < N - 1) {
  75.                 women[pu] = pv;
  76.                 w++;
  77.             } else {
  78.                 taken++;
  79.             }
  80.         }
  81.     }
  82.     if (m != N - 1 || w != N - 1) return -1;
  83.     return taken;
  84. }
  85.  
  86. int main() {
  87.     while (scanf("%d %d", &N, &M) == 2) {
  88.         for (int i = 0; i < M; i++) {
  89.             scanf("%d %d %d", &A[i].u, &A[i].v, &A[i].w);
  90.             A[i].u--, A[i].v--;
  91.         }
  92.         int res = mst();
  93.         printf("%d\n", res);
  94.     }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment