Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- const int maxn = 2e5 + 7;
- std::vector <std::vector <int>> gr;
- int d[maxn], dp[maxn];
- bool used[maxn], is_cutpoint[maxn];
- void dfs(int v, int p = -1) {
- used[v] = true;
- if (p != -1) d[v] = d[p] + 1;
- dp[v] = d[v];
- int power = 0;
- for (auto u : gr[v]) {
- if (!used[u]) {
- power++;
- dfs(u, v);
- dp[v] = std::min(dp[v], dp[u]);
- if (p != -1 && dp[u] >= d[v]) is_cutpoint[v] = true;
- }
- else if (u != p) {
- dp[v] = std::min(dp[v], d[u]);
- }
- }
- if (p == -1 && power > 1) is_cutpoint[v] = true;
- }
- signed main() {
- int n, m;
- std::cin >> n >> m;
- gr.resize(n + m);
- for (int i = 0; i < m; i++) {
- int u, v, p;
- std::cin >> u >> v >> p;
- u += m - 1;
- v += m - 1;
- p += m - 1;
- gr[u].push_back(i);
- gr[v].push_back(i);
- gr[p].push_back(i);
- gr[i].push_back(u);
- gr[i].push_back(v);
- gr[i].push_back(p);
- }
- dfs(0);
- std::vector<int> ans;
- for (int i = 0; i < m; i++) {
- if (is_cutpoint[i]) ans.push_back(i + 1);
- }
- std::cout << ans.size() << "\n";
- for (auto x : ans) std::cout << x << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement