fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 5e4 + 5;
  12.  
  13. int n, m;
  14. vector<int> adj[N];
  15. bool visited[N];
  16. bitset<N> bs[N]; // bs[u] là bitset đại diện cho tập đỉnh mà u đến được
  17.  
  18. void dfs(int u) {
  19. visited[u] = true;
  20. bs[u][u] = 1;
  21.  
  22. for (int v : adj[u]) {
  23. if (!visited[v]) dfs(v);
  24. bs[u] |= bs[v];
  25. }
  26. }
  27.  
  28. int main() {
  29. ios::sync_with_stdio(false);
  30. cin.tie(nullptr);
  31. cin >> n >> m;
  32.  
  33. for (int i = 0; i < m; i++) {
  34. int u, v;
  35. cin >> u >> v;
  36. adj[u].push_back(v);
  37. }
  38.  
  39. // O(m * n / w) (w = 32 hoặc 64)
  40. for (int u = 1; u <= n; u++) {
  41. if (!visited[u]) dfs(u);
  42. }
  43.  
  44. for (int u = 1; u <= n; u++) {
  45. cout << bs[u].count() << ' ';
  46. }
  47. }
  48.  
Success #stdin #stdout 0s 5288KB
stdin
5 6
1 2
1 3
1 4
2 3
3 5
4 5
stdout
5 3 2 2 1