#include "keys.h"
#include <bits/stdc++.h>
using namespace std;
#define vec vector
#define arr array
#define pii pair<int, int>
#define fir first
#define sec second
#define hset unordered_set
#define hmap unordered_map
const int N = 3e5 + 5, INF = 1e9;
// Zero indexing
int n;
arr<int, N> cl;
arr<vec<pii>, N> adj;
struct Dsj {
arr<int, N> prnt;
void intl() {
for (int u = 0; u < n; u++)
prnt[u] = u;
}
int pr(int u) {
return (prnt[u] == u) ? u : prnt[u] = pr(prnt[u]);
}
void mrg(int u, int v) { // v into u
u = pr(u), v = pr(v);
assert(u != v);
prnt[v] = u;
}
} dsj;
hset<int> act;
arr<hset<int>, N> vs;
arr<hmap<int, vec<int>>, N> ngh;
arr<hset<int>, N> cls;
arr<vec<int>, N> ord;
bool mv(int st) {
if (dsj.pr(st) != st) return false;
if (ord[st].empty()) return false;
int u = ord[st].back(); ord[st].pop_back();
for (pii x : adj[u]) {
int v = x.fir, c = x.sec;
if (cls[st].count(c)) {
if (dsj.pr(v) != dsj.pr(st)) {
dsj.mrg(v, st);
return false;
}
if (vs[st].count(v)) continue;
vs[st].insert(v);
ord[st].push_back(v);
} else {
ngh[st][c].push_back(v);
}
}
if (cls[st].count(cl[u])) return 1;
cls[st].insert(cl[u]);
for (int v : ngh[st][cl[u]]) {
if (dsj.pr(v) != dsj.pr(st)) {
dsj.mrg(v, st);
return false;
}
if (vs[st].count(v)) continue;
vs[st].insert(v);
ord[st].push_back(v);
}
return true;
}
arr<int, N> cnt;
void cnt_cmp() {
dsj.intl();
for (int u = 0; u < n; u++) {
vs[u].insert(u);
ord[u].push_back(u);
act.insert(u);
}
while (act.size()) {
vec<int> dlt;
for (int u : act)
if (!mv(u)) dlt.push_back(u);
for (int u : dlt) act.erase(u);
}
for (int u = 0; u < n; u++) {
int v = dsj.pr(u);
if (!vs[v].count(u)) cnt[u] = INF;
else cnt[u] = vs[v].size();
}
}
vec<int> find_reachable(vec<int> _cl, vec<int> _u, vec<int> _v, vec<int> _c) {
n = _cl.size();
for (int u = 0; u < n; u++) cl[u] = _cl[u];
for (int i = 0; i < _u.size(); i++) {
int u = _u[i], v = _v[i], c = _c[i];
adj[u].push_back({v, c});
adj[v].push_back({u, c});
}
cnt_cmp();
vec<int> ans(n);
int mn = *min_element(cnt.begin(), cnt.begin() + n);
for (int u = 0; u < n; u++)
if (cnt[u] == mn) ans[u] = 1;
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... |