Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- vector<vector<int>> g, g_r;
- vector<bool> used;
- vector<int> order;
- vector<int> component;
- void dfs(int v) {
- used[v] = true;
- for (int i : g[v])
- if (!used[i])
- dfs(i);
- order.emplace_back(v);
- }
- void dfs_r(int v) {
- used[v] = true;
- component.push_back(v);
- for (int i : g_r[v])
- if (!used[i])
- dfs_r(i);
- }
- int main() {
- int n, m;
- cin >> n >> m;
- used = vector<bool> (n);
- g = vector<vector<int>> (n);
- g_r = vector<vector<int>> (n);
- vector<pair<int,int>> s(m);
- for (int i = 0; i < m; i++) {
- int fr, to;
- cin >> fr >> to;
- fr--; to--;
- s[i] = make_pair(fr, to);
- g[fr].emplace_back(to);
- g_r[to].emplace_back(fr);
- }
- for (int i = 0; i < n; ++i)
- if (!used[i])
- dfs(i);
- used = vector<bool> (n);
- vector<int> component_per_v(n);
- int cnt = 0;
- for (int i = 0; i < n; ++i) {
- int v = order[n - 1 - i];
- if (!used[v]) {
- dfs_r(v);
- for (auto j : component){
- component_per_v[j] = cnt;
- }
- cnt++;
- component.clear();
- }
- }
- vector<bool> ans(cnt);
- for (int i = 0; i < m; i++){
- if (component_per_v[s[i].first] != component_per_v[s[i].second]){
- ans[component_per_v[s[i].first]] = true;
- }
- }
- vector<int> f_ans;
- for (int i = 0; i < cnt; i++){
- if (!ans[i]){
- for (int j = 0; j < n; j++){
- if (component_per_v[j] == i){
- f_ans.emplace_back(j);
- break;
- }
- }
- }
- }
- cout << f_ans.size() << '\n';
- for (auto &i : f_ans){
- cout << i + 1 << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment