usaco

Clean implementations of solutions to USACO problems

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
#include <bits/stdc++.h>
using namespace std;

int cnt = 0, c[200002], p[200002], ans[200002];
bitset<200002> vis;
vector<int> G[200002], H[200002];

void dfs(int u) {
	vis[u] = 1;
	for (auto& v : G[u]) {
		if (!vis[v]) dfs(v);
		if (c[v]) c[u] = max(p[c[v]], c[u]);
	}
	for (auto& v : H[u]) {
		if (!vis[v]) dfs(v);
		if (c[u]) c[v] = max(p[c[u]], c[v]);
	}
	if (!c[u]) c[u] = ++cnt;
	for (auto& v : G[u]) if (c[v]) p[c[v]] = max(c[u], p[c[v]]);
	for (auto& v : H[u]) if (c[v]) p[c[u]] = max(c[v], p[c[u]]);
}

int main() {
	ifstream cin("fcolor.in");
	ofstream cout("fcolor.out");

	int N, M; cin >> N >> M;
	while (M--) {
		int a, b; cin >> a >> b;
		G[b].push_back(a), H[a].push_back(b);
	}
	for (int u = 1; u <= N; ++u) dfs(u);
	vis.reset();
	for (int u = 1; u <= N; ++u) dfs(u);
	cnt = 0;
	for (int u = 1; u <= N; ++u) if (!ans[c[u]]) ans[c[u]] = ++cnt;
	for (int u = 1; u <= N; ++u) cout << ans[c[u]] << '\n';
}