Advertisement
Guest User

Untitled

a guest
Sep 19th, 2016
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 100100;
  9. int n, m;
  10. vector<int> g[N];
  11. int ed[N][3];
  12. int allCol;
  13. vector<int> cyclesForCol[N];
  14. vector<int> colForCycles[N];
  15. int h[N];
  16. int cycleId[N];
  17. bool haveCol[N];
  18. bool haveBridgeWithCol[N];
  19. int k;
  20. int par[N];
  21. int sz[N];
  22. bool good[N];
  23.  
  24. int getOther(int id, int v)
  25. {
  26.     return v ^ ed[id][0] ^ ed[id][1];
  27. }
  28.  
  29. void read()
  30. {
  31.     scanf("%d%d", &n, &m);
  32.     for (int i = 0; i < m; i++)
  33.     {
  34.         scanf("%d%d%d", &ed[i][0], &ed[i][1], &ed[i][2]);
  35.         cycleId[i] = -1;
  36.         ed[i][0]--;
  37.         ed[i][1]--;
  38.         g[ed[i][0]].push_back(i);
  39.         g[ed[i][1]].push_back(i);
  40.         if (!haveCol[ed[i][2]])
  41.         {
  42.             allCol++;
  43.             haveCol[ed[i][2]] = 1;
  44.         }
  45.     }
  46.     return;
  47. }
  48.  
  49. void dfs(int v)
  50. {
  51.     for (int id : g[v])
  52.     {
  53.         if (id == par[v]) continue;
  54.         int u = getOther(id, v);
  55.         if (h[u] == -1)
  56.         {
  57.             par[u] = id;
  58.             h[u] = h[v] + 1;
  59.             dfs(u);
  60.             continue;
  61.         }
  62.         if (h[u] > h[v]) continue;
  63.         cycleId[id] = k;
  64.         colForCycles[k].push_back(ed[id][2]);
  65.         int w = v;
  66.         while(w != u)
  67.         {
  68.             cycleId[par[w]] = k;
  69.             colForCycles[k].push_back(ed[par[w]][2]);
  70.             w = getOther(par[w], w);
  71.         }
  72.         k++;
  73.     }
  74. }
  75.  
  76. int getPar(int v)
  77. {
  78.     return (par[v] == -1 ? v : par[v] = getPar(par[v]));
  79. }
  80.  
  81. void unite(int v, int u)
  82. {
  83.     v = getPar(v);
  84.     u = getPar(u);
  85.     if (v == u)
  86.     {
  87.         if (good[v]) return;
  88.         allCol++;
  89.         good[v] = 1;
  90.         return;
  91.     }
  92.     if (sz[v] < sz[u]) swap(v, u);
  93.     if (!good[v] || !good[u]) allCol++;
  94.     par[u] = v;
  95.     sz[v] += sz[u];
  96.     good[v] |= good[u];
  97.     return;
  98. }
  99.  
  100. int main()
  101. {
  102. //  freopen("input.txt", "r", stdin);
  103. //  freopen("output.txt", "w", stdout);
  104.  
  105.     read();
  106.     for (int v = 0; v < n; v++)
  107.         h[v] = par[v] = -1;
  108.     h[0] = 0;
  109.     dfs(0);
  110.     for (int i = 0; i < m; i++)
  111.     {
  112.         if (cycleId[i] != -1) continue;
  113.         haveBridgeWithCol[ed[i][2]] = 1;
  114.     }
  115.     for (int id = 0; id < k; id++)
  116.     {
  117.         sz[id] = 1;
  118.         par[id] = -1;
  119.         good[id] = 0;
  120.         for (int c : colForCycles[id])
  121.         {
  122. //          printf("%d ", c);
  123.             if (haveBridgeWithCol[c])
  124.                 good[id] = 1;
  125.             else
  126.                 cyclesForCol[c].push_back(id);
  127.         }
  128.         if (!good[id]) allCol--;
  129. //      printf("\n");
  130.     }
  131. //  printf("%d\n", allCol);
  132.     for (int c = 1; c <= m; c++)
  133.         for (int i = 0; i < (int)cyclesForCol[c].size() - 1; i++)
  134.             unite(cyclesForCol[c][i], cyclesForCol[c][i + 1]);
  135.     printf("%d\n", allCol);
  136.  
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement