Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- const int MAGIC = 1000;
- vector<int> RE[200005], E[200005];
- int reach[200005], P[200005], take, reset[200005];
- bool used[200005];
- void go(int x) {
- if (used[x]) return;
- used[x] = true;
- ++reach[x];
- for (int y : RE[x]) {
- go(y);
- }
- }
- void come(int x) {
- if (take > MAGIC) return;
- if (used[x]) return;
- used[x] = true;
- reset[take++] = x;
- for (int y : E[x]) {
- come(y);
- }
- }
- int main() {
- int N, M;
- scanf("%d%d", &N, &M);
- for (int i = 1; i <= N; ++i) P[i] = i;
- for (int i = 0; i < M; ++i) {
- int a, b;
- scanf("%d%d", &a, &b);
- RE[b].push_back(a);
- E[a].push_back(b);
- }
- random_device rd;
- mt19937 gen(rd());
- shuffle(P + 1, P + N + 1, gen);
- for (int i = 1; i <= min(N, MAGIC); ++i) {
- memset(used, 0, sizeof(used));
- go(P[i]);
- }
- memset(used, 0, sizeof(used));
- for (int i = 1; i <= N; ++i) {
- reach[i] = MAGIC < N ? N / (double)MAGIC * reach[i] : reach[i];
- if (reach[i] < MAGIC * 2) {
- take = 0;
- come(i);
- reach[i] = 2 * take;
- for (int j = 0; j < take; ++j) used[reset[j]] = false;
- }
- printf("%d\n", reach[i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement