Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <iostream>
- #include <algorithm>
- #include <fstream>
- #include <iomanip>
- #include <stack>
- #include <map>
- #include <set>
- #include <string>
- #include <queue>
- using namespace std;
- typedef long long ll;
- int n, m;
- vector<vector<int> > g(n);
- vector<bool> used;
- vector<int> tin, fup;
- vector<pair<int, int> > ans;
- int timer;
- void dfs(int v, int p = -1)
- {
- used[v] = true;
- tin[v] = fup[v] = timer++;
- for (int i = 0; i < g[v].size(); i++)
- {
- int to = g[v][i];
- if (to == p)
- {
- continue;
- }
- if (used[to])
- {
- fup[v] = min(fup[v], tin[to]);
- }
- else
- {
- dfs(to, v);
- fup[v] = min(fup[v], fup[to]);
- if (fup[to] > tin[v])
- {
- ans.push_back(make_pair(v+1, to+1));
- }
- }
- }
- }
- void find_bridges()
- {
- timer = 0;
- for (int i = 0; i < n; i++)
- {
- if (!used[i])
- {
- dfs(i);
- }
- }
- }
- int main()
- {
- cin >> n >> m;
- g.resize(n);
- used.resize(n);
- tin.resize(n);
- fup.resize(n);
- vector<pair<int, int> > Ans_pair;
- for (int i(0); i < m; i++)
- {
- int x, y;
- cin >> x >> y;
- x--; y--;
- g[x].push_back(y);
- g[y].push_back(x);
- Ans_pair.push_back(make_pair(x+1, y+1));
- }
- find_bridges();
- cout << ans.size() << endl;
- for (int i(0); i < Ans_pair.size(); i++)
- {
- for (int j(0); j < ans.size(); j++)
- {
- if (ans[j] == Ans_pair[i] || (ans[j].first == Ans_pair[i].second && ans[j].second == Ans_pair[i].first))
- {
- cout << i+1 << endl;
- break;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement