Submission #1230938

#TimeUsernameProblemLanguageResultExecution timeMemory
1230938gelastropodPovjerenstvo (COI22_povjerenstvo)C++20
34 / 100
442 ms66660 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
	int N, M, a, b, numans = 0;
	cin >> N >> M;
	vector<vector<int>> adjlist(N, vector<int>());
	vector<vector<int>> revadjlist(N, vector<int>());
	vector<pair<int, int>> edges;
	vector<int> outdeg(N, 0);
	for (int i = 0; i < M; i++) {
		cin >> a >> b;
		a--, b--;
		adjlist[a].push_back(b);
		revadjlist[b].push_back(a);
		edges.push_back({ a, b });
		outdeg[a]++;
	}
	vector<bool> inans(N, false);
	queue<int> proc;
	vector<bool> visited(N, false);
	for (int i = 0; i < N; i++) {
		if (outdeg[i] == 0) {
			proc.push(i);
			visited[i] = true;
		}
	}
	bool die = false;
	while (!proc.empty() && !die) {
		int i = proc.front();
		proc.pop();
		inans[i] = true;
		numans++;
		for (int j : revadjlist[i]) {
			if (inans[j]) {
				die = true;
				break;
			}
			if (visited[j]) continue;
			visited[j] = true;
			for (int k : adjlist[j]) {
				if (visited[k]) continue;
				if (outdeg[k] == 0) {
					proc.push(k);
					visited[k] = true;
				}
			}
			for (int k : revadjlist[j]) {
				if (visited[k]) continue;
				outdeg[k]--;
				if (outdeg[k] == 0) {
					proc.push(k);
					visited[k] = true;
				}
			}
		}
		for (int j : adjlist[i]) {
			if (inans[j]) {
				die = true;
				break;
			}
		}
	}
	if (die) {
		cout << "-1\n";
		return 0;
	}
	for (int _ = 0; _ < N; _++) {
		if (visited[_]) continue;
		bool cannot = false;
		for (int i : adjlist[_]) {
			if (inans[i]) {
				cannot = true;
				break;
			}
		}
		for (int i : revadjlist[_]) {
			if (inans[i]) {
				cannot = true;
				break;
			}
		}
		if (cannot) continue;
		proc.push(_);
		visited[_] = true;
		inans[_] = true;
		while (!proc.empty() && !die) {
			int i = proc.front();
			proc.pop();
			inans[i] = true;
			numans++;
			for (int j : revadjlist[i]) {
				if (inans[j]) {
					die = true;
					break;
				}
				if (visited[j]) continue;
				visited[j] = true;
				for (int k : adjlist[j]) {
					if (visited[k]) continue;
					if (outdeg[k] == 0) {
						proc.push(k);
						visited[k] = true;
					}
				}
				for (int k : revadjlist[j]) {
					if (visited[k]) continue;
					outdeg[k]--;
					if (outdeg[k] == 0) {
						proc.push(k);
						visited[k] = true;
					}
				}
			}
			for (int j : adjlist[i]) {
				if (inans[j]) {
					die = true;
					break;
				}
			}
		}
		if (die) break;
	}
	for (auto i : visited) if (!i) die = true;
	for (auto& i : edges) {
		if (inans[i.first] && inans[i.second]) die = true;
	}
	if (die) {
		cout << "-1\n";
		return 0;
	}
	cout << numans << '\n';
	for (int i = 0; i < N; i++) {
		if (inans[i]) cout << i + 1 << ' ';
	}
	cout << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...