Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- using namespace std;
- const int N = 2005;
- int n, m;
- vector<int> a[N];
- int cnt, SCC, top;
- int low[N], id[N], st[N], SCC_id[N], in[N], out[N];
- bool visited[N];
- void Tarjan(int u) {
- low[u] = id[u] = ++cnt;
- st[++top] = u;
- for(int v : a[u]) {
- if(visited[v]) continue;
- if(id[v] != 0)
- low[u] = min(low[u], id[v]);
- else {
- Tarjan(v);
- low[u] = min(low[u], low[v]);
- }
- }
- if(id[u] == low[u]) {
- SCC++;
- int v;
- while(v != u) {
- v = st[top--];
- SCC_id[v] = SCC;
- visited[v] = true;
- }
- }
- }
- int main()
- {
- //freopen("in.txt", "r", stdin);
- //freopen("NKONEARC .inp", "r", stdin);
- //freopen("NKONEARC .out", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- cin >> n >> m;
- for(int i = 1; i <= m; i++) {
- int u, v;; cin >> u >> v;
- a[u].push_back(v);
- }
- for(int i = 1; i <= n; i++)
- if(id[i] == 0)
- Tarjan(i);
- for(int u = 1; u <= n; u++)
- for(int v : a[u]) {
- if(SCC_id[u] != SCC_id[v]) {
- ++in[SCC_id[v]];
- ++out[SCC_id[u]];
- }
- }
- int source = 0, sink = 0;
- int s = -1, t = -1;
- for(int i = 1; i <= SCC; i++) {
- if(in[i] == 0)
- source++, s = i;
- if(out[i] == 0)
- sink++, t = i;
- }
- if(source != 1 || sink != 1)
- cout << "NO" << '\n';
- else {
- cout << "YES" << '\n';
- for(int i = 1; i <= n; i++)
- if(SCC_id[i] == s) {
- s = i; break;
- }
- for(int i = 1; i <= n; i++)
- if(SCC_id[i] == t) {
- t = i; break;
- }
- cout << t << ' ' << s << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment