Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- vector<vector<int>> g;
- vector<int> ord, used, u;
- void dfs(int v)
- {
- if(used[v])
- {
- return;
- }
- used[v] = true;
- u[v] = true;
- for(auto i : g[v])
- {
- dfs(i);
- }
- }
- void dfs1(int v)
- {
- if(used[v] || u[v])
- {
- return;
- }
- used[v] = true;
- for(auto i : g[v])
- {
- dfs1(i);
- }
- ord.push_back(v);
- }
- void dfs2(int v)
- {
- if(used[v] || u[v])
- {
- return;
- }
- used[v] = true;
- for(auto i : g[v])
- {
- dfs2(i);
- }
- }
- int main()
- {
- int n, m, s;
- cin >> n >> m >> s;
- g.resize(n + 1);
- used.resize(n + 1);
- u.resize(n + 1);
- for(int i = 0; i < m; ++i)
- {
- int a, b;
- cin >> a >> b;
- g[a].push_back(b);
- }
- dfs(s);
- used.assign(n + 1, 0);
- for(int i = 1; i <= n; ++i)
- {
- if(!used[i] && !u[i])
- {
- dfs1(i);
- }
- }
- reverse(ord.begin(), ord.end());
- int ans = 0;
- used.assign(n + 1, 0);
- for(auto i : ord)
- {
- if(!used[i] && !u[i])
- {
- dfs2(i);
- ++ans;
- }
- }
- cout << ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement