1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
using namespace std;
typedef long long ll; typedef double db; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<pii> vp; const int inf = 1e9; const ll INF = 1e18;
#define fi first #define se second #define pb push_back #define eb emplace_back #define mem(a) memset(a, 0, sizeof(a)) #define PA puts("pass") #define lowbit(x) (x & -x) const int maxn = 2e5 + 5; vi g[maxn], rg[maxn], ng[maxn], G[maxn]; int n, m; int dfn[maxn], id[maxn], dfs_clock, fa[maxn], f[maxn]; int semi[maxn], idom[maxn], mn[maxn], ans[maxn];
int (int x){ if(x == f[x]) return x; int p = find(f[x]); if(dfn[semi[mn[f[x]]]] < dfn[semi[mn[x]]]) mn[x] = mn[f[x]]; return f[x] = p; }
void dfs(int u){ dfn[u] = ++dfs_clock, id[dfs_clock] = u; for(auto &v : g[u]){ if(dfn[v]) continue; fa[v] = u; dfs(v); } }
void tarjan(){ for(int i = dfs_clock; i > 1; i--){ int u = id[i]; for(auto &v : rg[u]){ if(!dfn[v]) continue; find(v); if(dfn[semi[mn[v]]] < dfn[semi[u]]) semi[u] = semi[mn[v]]; } ng[semi[u]].eb(u); f[u] = fa[u]; u = fa[u]; for(auto &v : ng[u]){ find(v); if(semi[mn[v]] == u) idom[v] = u; else idom[v] = mn[v]; } } for(int i = 2; i <= dfs_clock; i++){ int u = id[i]; if(idom[u] != semi[u]) idom[u] = idom[idom[u]]; } }
void getans(int u){ ans[u] = 1; for(auto &v : G[u]){ getans(v); ans[u] += ans[v]; } }
int main(){ ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; ++i) { semi[i] = mn[i] = f[i] = i; } for (int i = 1; i <= m; ++i) { int u, v; cin >> u >> v; g[u].eb(v); rg[v].eb(u); } dfs(1); tarjan(); for(int i = 2; i <= n; i++) G[idom[i]].eb(i); getans(1); for(int i = 1; i <= n; i++) cout << ans[i] << (i == n ? 'n' : ' '); return 0; }
|
近期评论