#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;
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 (int i = 0; i < N; i++) {
int haha = 0;
for (int j : adjlist[i]) {
if (inans[i] && inans[j]) die = true;
haha += inans[j];
}
for (int j : revadjlist[i]) {
if (inans[i] && inans[j]) die = true;
haha += inans[j];
}
if (!inans[i] && !haha) 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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |