Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int N = 100100;
- int n, m;
- vector<int> g[N];
- int ed[N][3];
- int allCol;
- vector<int> cyclesForCol[N];
- vector<int> colForCycles[N];
- int h[N];
- int cycleId[N];
- bool haveCol[N];
- bool haveBridgeWithCol[N];
- int k;
- int par[N];
- int sz[N];
- bool good[N];
- int getOther(int id, int v)
- {
- return v ^ ed[id][0] ^ ed[id][1];
- }
- void read()
- {
- scanf("%d%d", &n, &m);
- for (int i = 0; i < m; i++)
- {
- scanf("%d%d%d", &ed[i][0], &ed[i][1], &ed[i][2]);
- cycleId[i] = -1;
- ed[i][0]--;
- ed[i][1]--;
- g[ed[i][0]].push_back(i);
- g[ed[i][1]].push_back(i);
- if (!haveCol[ed[i][2]])
- {
- allCol++;
- haveCol[ed[i][2]] = 1;
- }
- }
- return;
- }
- void dfs(int v)
- {
- for (int id : g[v])
- {
- if (id == par[v]) continue;
- int u = getOther(id, v);
- if (h[u] == -1)
- {
- par[u] = id;
- h[u] = h[v] + 1;
- dfs(u);
- continue;
- }
- if (h[u] > h[v]) continue;
- cycleId[id] = k;
- colForCycles[k].push_back(ed[id][2]);
- int w = v;
- while(w != u)
- {
- cycleId[par[w]] = k;
- colForCycles[k].push_back(ed[par[w]][2]);
- w = getOther(par[w], w);
- }
- k++;
- }
- }
- int getPar(int v)
- {
- return (par[v] == -1 ? v : par[v] = getPar(par[v]));
- }
- void unite(int v, int u)
- {
- v = getPar(v);
- u = getPar(u);
- if (v == u)
- {
- if (good[v]) return;
- allCol++;
- good[v] = 1;
- return;
- }
- if (sz[v] < sz[u]) swap(v, u);
- if (!good[v] || !good[u]) allCol++;
- par[u] = v;
- sz[v] += sz[u];
- good[v] |= good[u];
- return;
- }
- int main()
- {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- read();
- for (int v = 0; v < n; v++)
- h[v] = par[v] = -1;
- h[0] = 0;
- dfs(0);
- for (int i = 0; i < m; i++)
- {
- if (cycleId[i] != -1) continue;
- haveBridgeWithCol[ed[i][2]] = 1;
- }
- for (int id = 0; id < k; id++)
- {
- sz[id] = 1;
- par[id] = -1;
- good[id] = 0;
- for (int c : colForCycles[id])
- {
- // printf("%d ", c);
- if (haveBridgeWithCol[c])
- good[id] = 1;
- else
- cyclesForCol[c].push_back(id);
- }
- if (!good[id]) allCol--;
- // printf("\n");
- }
- // printf("%d\n", allCol);
- for (int c = 1; c <= m; c++)
- for (int i = 0; i < (int)cyclesForCol[c].size() - 1; i++)
- unite(cyclesForCol[c][i], cyclesForCol[c][i + 1]);
- printf("%d\n", allCol);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement