256412026-02-23 21:01:30GeneratrollHálózatjavításcpp17Time limit exceeded 1/50400ms3636 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, m;
	cin >> n >> m;
	vector<vector<int>> g(n + 1);
	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;
		g[u].push_back(v);
	}
	vector<int> d(n + 1, 0), l(n + 1, 0), s;
	vector<bool> b(n + 1, false);
	vector<vector<int>> c;
	int t = 0;
	auto f1 = [&](auto self, int u) -> void {
		d[u] = l[u] = ++t;
		s.push_back(u);
		b[u] = true;
		for (int v : g[u]) {
			if (d[v] == 0) {
				self(self, v);
				l[u] = min(l[u], l[v]);
			} else if (b[v]) {
				l[u] = min(l[u], d[v]);
			}
		}
		if (l[u] == d[u]) {
			vector<int> sc;
			while (true) {
				int v = s.back();
				s.pop_back();
				b[v] = false;
				sc.push_back(v);
				if (u == v) {
					break;
				}
			}
			if (sc.size() > 1) {
				c.push_back(sc);
			}
		}
	};
	for (int i = 1; i <= n; i++) {
		if (d[i] == 0) {
			f1(f1, i);
		}
	}
	if (c.size() != 1) {
		cout << 0 << "\n";
		return 0;
	}
	vector<int> sn = c[0];
	vector<bool> is(n + 1, false);
	for (int u : sn) {
		is[u] = true;
	}
	vector<vector<int>> as(n + 1);
	for (int u : sn) {
		for (int v : g[u]) {
			if (is[v]) {
				as[u].push_back(v);
			}
		}
	}
	auto f2 = [&](int su, int sv, vector<int>& tp) {
		vector<int> id(n + 1, 0);
		for (int u : sn) {
			for (int v : as[u]) {
				if (u == su && v == sv) {
					continue;
				}
				id[v]++;
			}
		}
		tp.clear();
		vector<int> q;
		for (int u : sn) {
			if (id[u] == 0) {
				q.push_back(u);
			}
		}
		int h = 0;
		while (h < (int)q.size()) {
			int u = q[h++];
			tp.push_back(u);
			for (int v : as[u]) {
				if (u == su && v == sv) {
					continue;
				}
				if (--id[v] == 0) {
					q.push_back(v);
				}
			}
		}
		return (int)tp.size() == (int)sn.size();
	};
	auto f3 = [&](int su, int sv, vector<int>& cy) {
		vector<int> vs(n + 1, 0), pt;
		auto f = [&](auto self, int u) -> bool {
			vs[u] = 1;
			pt.push_back(u);
			for (int v : as[u]) {
				if (u == su && v == sv) {
					continue;
				}
				if (vs[v] == 1) {
					bool found = false;
					for (int x : pt) {
						if (x == v) {
							found = true;
						}
						if (found) {
							cy.push_back(x);
						}
					}
					return true;
				}
				if (vs[v] == 0 && self(self, v)) {
					return true;
				}
			}
			vs[u] = 2;
			pt.pop_back();
			return false;
		};
		for (int r : sn) {
			if (vs[r] == 0 && f(f, r)) {
				return true;
			}
		}
		return false;
	};
	vector<int> cc;
	f3(-1, -1, cc);
	int u0 = -1, v0 = -1;
	while (u0 == -1) {
		int cu = -1, cv = -1;
		for (int i = 0; i < (int)cc.size(); i++) {
			int u = cc[i], v = cc[(i + 1) % cc.size()];
			bool found = false;
			for (int nxt : as[u]) {
				if (nxt == v) {
					cu = u;
					cv = v;
					found = true;
					break;
				}
			}
			if (found) {
				break;
			}
		}
		vector<int> tp;
		if (f2(cu, cv, tp)) {
			u0 = cu;
			v0 = cv;
		} else {
			cc.clear();
			f3(cu, cv, cc);
			if (cc.empty()) {
				cout << 0 << "\n";
				return 0;
			}
		}
	}
	vector<int> tp;
	f2(u0, v0, tp);
	ll m1 = 1000000007, m2 = 1000000009;
	vector<ll> d11(n + 1, 0), d12(n + 1, 0), d21(n + 1, 0), d22(n + 1, 0);
	d11[v0] = 1;
	d12[v0] = 1;
	for (int u : tp) {
		for (int v : as[u]) {
			if (u == u0 && v == v0) {
				continue;
			}
			d11[v] = (d11[v] + d11[u]) % m1;
			d12[v] = (d12[v] + d12[u]) % m2;
		}
	}
	d21[u0] = 1;
	d22[u0] = 1;
	for (int i = (int)tp.size() - 1; i >= 0; i--) {
		int u = tp[i];
		for (int v : as[u]) {
			if (u == u0 && v == v0) {
				continue;
			}
			d21[u] = (d21[u] + d21[v]) % m1;
			d22[u] = (d22[u] + d22[v]) % m2;
		}
	}
	ll t1 = d11[u0], t2 = d12[u0];
	vector<pair<int, int>> ans;
	ans.push_back({u0, v0});
	for (int u : sn) {
		for (int v : as[u]) {
			if (u == u0 && v == v0) {
				continue;
			}
			if ((d11[u] * d21[v]) % m1 == t1 && (d12[u] * d22[v]) % m2 == t2) {
				ans.push_back({u, v});
			}
		}
	}
	cout << (int)ans.size() << "\n";
	for (auto& e : ans) {
		cout << e.first << " " << e.second << "\n";
	}
	return 0;
}
SubtaskSumTestVerdictTimeMemory
base1/50
1Accepted0/01ms316 KiB
2Time limit exceeded0/0384ms3380 KiB
3Accepted1/11ms508 KiB
4Time limit exceeded0/1384ms316 KiB
5Time limit exceeded0/1398ms332 KiB
6Time limit exceeded0/1400ms724 KiB
7Time limit exceeded0/1384ms564 KiB
8Time limit exceeded0/2384ms1092 KiB
9Time limit exceeded0/2400ms1076 KiB
10Time limit exceeded0/2400ms564 KiB
11Time limit exceeded0/2382ms1332 KiB
12Time limit exceeded0/2382ms580 KiB
13Time limit exceeded0/2400ms1896 KiB
14Time limit exceeded0/2400ms1672 KiB
15Time limit exceeded0/2389ms2356 KiB
16Time limit exceeded0/2391ms2348 KiB
17Time limit exceeded0/2400ms2820 KiB
18Time limit exceeded0/2400ms3264 KiB
19Time limit exceeded0/2381ms3124 KiB
20Time limit exceeded0/2381ms3380 KiB
21Time limit exceeded0/2400ms3516 KiB
22Time limit exceeded0/2400ms3380 KiB
23Time limit exceeded0/3377ms3512 KiB
24Time limit exceeded0/4377ms3380 KiB
25Time limit exceeded0/4400ms3380 KiB
26Time limit exceeded0/4400ms3636 KiB