#include <bits/stdc++.h>
// #include "grader.cpp"
using namespace std;
struct Dsu{
private:
int N;
vector<int> p;
public:
vector<vector<int>> child;
Dsu(int iN){
N = iN;
p.resize(N);
child.resize(N);
for(int i = 0;i < N;i++) {
p[i] = i;
child[i].push_back(i);
}
}
int get(int cur){
if(p[cur] == cur) return cur;
p[cur] = get(p[cur]);
return p[cur];
}
void merge(int a,int b){
int pa = get(a);
int pb = get(b);
if(pa == pb)return;
if(child[pa].size() > child[pb].size()) swap(pa,pb);
// merge pa to pb;
p[pa] = pb;
for(auto &i:child[pa]) child[pb].push_back(i);
}
};
vector<int> find_reachable(vector<int> R, vector<int> U, vector<int> V, vector<int> C) {
int N = R.size(),M = U.size();
vector<int> cnt(N,0);
vector<vector<pair<int,int>>> edges(N);
for(int i = 0;i < M;i++){
edges[C[i]].push_back({U[i],V[i]});
}
auto bfs = [&](int start){
vector<int> used(N,false);
queue<int> q;
q.push(start);
Dsu dsu(N);
while(!q.empty()){
int ckey = R[q.front()];
q.pop();
if(used[ckey]) continue;
used[ckey] = true;
for(auto [u,v]:edges[ckey]){
if(dsu.get(u) == dsu.get(v)) continue;
if(dsu.get(u) == dsu.get(start) || dsu.get(v) == dsu.get(start)){
if(dsu.get(v) == dsu.get(start)) swap(u,v);
// merge v into
for(auto i:dsu.child[dsu.get(v)]) q.push(i);
}
dsu.merge(u,v);
}
}
return dsu.child[dsu.get(start)].size();
};
for(int i = 0;i < N;i++){
cnt[i] = bfs(i);
}
// for(auto &i:cnt) cout << i << " ";cout << "!" << endl;
int minsz = *min_element(cnt.begin(),cnt.end());
vector<int> ans(N,0);
for(int i = 0;i < N;i++) ans[i] = (cnt[i] == minsz);
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... |