#include "train.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005, INF = 1e6;
int n, m;
vector<int> own, ans, charge, station;
vector<int> adj[maxn], radj[maxn];
int cnt[maxn];
void dfs(int u) {
// cout << u << " " << ans[u] << endl;
for (int v:radj[u]) if (ans[v] == -1) {
cnt[v]++;
if (own[v] == 1 && ans[u] == 1) {
ans[v] = 1;
dfs(v);
} else if (own[v] == 0 && ans[u] == 0) {
ans[v] = 0;
dfs(v);
} else if (cnt[v] == adj[v].size()) {
ans[v] = !own[v];
dfs(v);
}
}
}
vector<int> who_wins(vector<int> A, vector<int> R, vector<int> U, vector<int> V) {
n = R.size(), m = U.size();
own = A, charge = R;
ans.resize(n);
for (int i=0;i<m;i++) {
adj[U[i]].push_back(V[i]);
radj[V[i]].push_back(U[i]);
}
for (int i=0;i<n;i++) if (charge[i]) station.push_back(i);
while (true) {
for (int i=0;i<n;i++) ans[i] = -1;
for (int u:station) {
ans[u] = 1;
dfs(u);
}
for (int i=0;i<n;i++) if (ans[i] == -1) ans[i] = 0;
vector<int> del;
for (int u:station) {
int thing;
if (own[u] == 1) {
thing = 0;
for (int v:adj[u]) thing = max(ans[v], thing);
} else if (own[u] == 0) {
thing = 1;
for (int v:adj[u]) thing = min(ans[v], thing);
}
if (!thing) del.push_back(u);
}
if (!del.size()) break;
for (int i:del) station.erase(find(station.begin(), station.end(), i));
}
return ans;
}
# | 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... |