#include<bits/stdc++.h> #define LL long long #define debug usingnamespace std;
constint N = 1e5+66;
int n, m, res;
structnode {int to, nxt;}e[N]; int head[N], num; inlinevoidadd_edge(int u, int v){ ++ num; e[num].to = v, e[num].nxt = head[u]; head[u] = num; }
vector<int>scc[N]; int tp, tot, cnt; int dfn[N], low[N], sta[N], in[N], tar[N], d[N]; //tar[i] has showed the i belong which SCC inlinevoidtarjan(int x){ dfn[x] = low[x] = ++ tot; in[x] = 1, sta[++ tp] = x; for (int i = head[x]; i; i = e[i].nxt) { int y = e[i].to; if (!dfn[y]) { tarjan(y); low[x] = min(low[x], low[y]); } elseif (in[y]) low[x] = min(low[x], dfn[y]); } if (dfn[x] == low[x]) { int y; ++ cnt; do { y = sta[tp --]; in[y] = 0; tar[y] = cnt; scc[cnt].push_back(y); } while (x != y); } }
inlineintthestars(){ cin >> n >> m; for (int i = 1; i <= m; ++ i) { int u, v; scanf ("%d%d", &u, &v); add_edge(u, v); } for (int i = 1; i <= n; ++ i) { if (!dfn[i]) { tarjan(i); } } for (int x = 1; x <= n; ++ x) { for (int i = head[x]; i; i = e[i].nxt) { int y = e[i].to; if (tar[x] == tar[y]) continue; else d[tar[x]] = 1; } } for (int i = 1; i <= cnt; ++ i) { if (!d[i]) { if (res) {res = 0; break;} res = scc[i].size(); } } cout << res; return0; } //the topic aim:find all the T.size(), and the T = ("chudu" == 0) //how can I do? int youngore = thestars();
#include<bits/stdc++.h> #define LL long long #define debug usingnamespace std;
constint N = 1e5+66;
int T, n, m, num, tp, flag; int a[N], z[N]; int deg[N];
structedge{int to, nxt;}e[N]; int head[N], cnt;
inlinevoidadd_edge(int u, int v){ ++ cnt; e[cnt].to = v, e[cnt].nxt = head[u]; head[u] = cnt; ++ deg[v]; }
inlinevoidtopsort(){ priority_queue<int>q; for (int i = 1; i <= n; ++ i) { if (!deg[i]) { q.push(i); } } while (q.size()) { flag = 1; int x = q.top(); q.pop(); z[++ num] = x; for (int i = head[x]; i; i = e[i].nxt) { int y = e[i].to; if (-- deg[y] == 0) { q.push(y); } } } }
inlineintthestars(){ cin >> T; while (T --) { flag = 0, num = 0, tp = 0, cnt = 0; memset(a, 0, sizeof a); memset(z, 0, sizeof z); memset(head, 0, sizeof head); memset(deg, 0, sizeof deg); scanf ("%d%d", &n, &m); for (int i = 1; i <= m; ++ i) { int x, y; scanf ("%d%d", &x, &y); add_edge(y, x); } topsort(); if (num == n) { for (int i = 1; i <= num; ++ i) a[num-i+1] = z[i]; for (int i = 1; i <= num; ++ i) cout << a[i] << ' '; puts(""); } elseputs("Impossible!"); } return0; }