#include <bits/stdc++.h>
//#include "train.h"
using namespace std;
vector<int> who_wins(vector<int> own, vector<int> rs, vector<int> us, vector<int> vs) {
int n = own.size();
vector<vector<int>> G(n), G_rev(n);
for (int i = 0; i < us.size(); ++i) {
G[us[i]].push_back(vs[i]);
G_rev[vs[i]].push_back(us[i]);
}
//volt[i] = 1 if starting from vertex i it is possible to reach any vertex in ss regardless of the opponents moves
auto reach = [&](vector<bool> &ss) {
vector<bool> volt = ss;
queue<int> q;
for (int i = 0; i < n; ++i) {
if (volt[i]) q.push(i);
}
vector<int> in(n);
for (int i = 0; i < n; ++i) {
if (!own[i]) in[i] = G[i].size();
}
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v: G_rev[u]) {
if (volt[v]) continue;
if (own[v]) {
volt[v] = true;
q.push(v);
}
else {
if (--in[v] == 0) {
volt[v] = true;
q.push(v);
}
}
}
}
return volt;
};
//current set of verticies to check
vector<bool> rline(rs.begin(), rs.end());
bool change = true;
while (change) {
vector<bool> fs = reach(rline);
change = false;
for (int u = 0; u < n; ++u) {
if (own[u]) {
bool ok = false;
for (int v: G[u]) {
if (fs[v]) ok = true;
}
if (!ok) {
rline[u] = false;
change = true;
}
}
else {
bool ok = true;
for (int v: G[u]){
if (!fs[v]) ok = false;
}
if (!ok) {
rline[u] = false;
change = true;
}
}
}
}
auto ans = reach(rline);
return vector<int>(ans.begin(), ans.end());
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |