제출 #1230938

#제출 시각아이디문제언어결과실행 시간메모리
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...