Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. const int MAGIC = 1000;
  6. vector<int> RE[200005], E[200005];
  7. int reach[200005], P[200005], take, reset[200005];
  8. bool used[200005];
  9. void go(int x) {
  10.     if (used[x]) return;
  11.     used[x] = true;
  12.     ++reach[x];
  13.     for (int y : RE[x]) {
  14.         go(y);
  15.     }
  16. }
  17. void come(int x) {
  18.     if (take > MAGIC) return;
  19.     if (used[x]) return;
  20.     used[x] = true;
  21.     reset[take++] = x;
  22.     for (int y : E[x]) {
  23.         come(y);
  24.     }
  25. }
  26. int main() {
  27.     int N, M;
  28.     scanf("%d%d", &N, &M);
  29.     for (int i = 1; i <= N; ++i) P[i] = i;
  30.     for (int i = 0; i < M; ++i) {
  31.         int a, b;
  32.         scanf("%d%d", &a, &b);
  33.         RE[b].push_back(a);
  34.         E[a].push_back(b);
  35.     }
  36.     random_device rd;
  37.     mt19937 gen(rd());
  38.     shuffle(P + 1, P + N + 1, gen);
  39.     for (int i = 1; i <= min(N, MAGIC); ++i) {
  40.         memset(used, 0, sizeof(used));
  41.         go(P[i]);
  42.     }
  43.     memset(used, 0, sizeof(used));
  44.     for (int i = 1; i <= N; ++i) {
  45.         reach[i] = MAGIC < N ? N / (double)MAGIC * reach[i] : reach[i];
  46.         if (reach[i] < MAGIC * 2) {
  47.             take = 0;
  48.             come(i);
  49.             reach[i] = 2 * take;
  50.             for (int j = 0; j < take; ++j) used[reset[j]] = false;
  51.         }
  52.         printf("%d\n", reach[i]);
  53.     }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement