제출 #1325283

#제출 시각아이디문제언어결과실행 시간메모리
1325283eri16열쇠 (IOI21_keys)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>
#include "keys.h"

using namespace std;

class DisjointUnionSets {
    vector<int> rank, parent;
 
public:
  
    DisjointUnionSets(int n){
        rank.resize(n, 1);
        parent.resize(n);
 
        for (int i=0; i<n; i++){
            parent[i]=i;
        }
    }
 
    int find(int i){
        int root=parent[i];
      
        if (parent[root]!=root){
            return parent[i]=find(root);
        }
      
        return root;
    }
    
    int func(int i){
        int root=find(i);
        return rank[root];
    }
    
    void unionSets(int x, int y){
        int xRoot=find(x);
        int yRoot=find(y);
 
        if (xRoot==yRoot) return;
 
        if (rank[xRoot]<rank[yRoot]){
            parent[xRoot]=yRoot;
            rank[yRoot]+=rank[xRoot];
        } 
        else if (rank[yRoot]<rank[xRoot]){
            parent[yRoot]=xRoot;
            rank[xRoot]+=rank[yRoot];
        } 
        else{
            parent[yRoot]=xRoot;
            rank[xRoot]+=rank[yRoot];
        }
    }
};

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c){
    
    int n=r.size();
    int m=u.size();
    DisjointUnionSets dus(n);
    for (int i=0; i<m; i++){
        if (c[i]==0){
            //adj[u[i]].push_back(v[i]);
            //adj[v[i]].push_back(u[i]);
            dus.unionSets(u[i],v[i]);
        }
    }
    
    int mn = INT_MAX;
    
    for (int i=0; i<n; i++){
        mn=min(mn,dus.func(i));
    }
    vector <int> ans(n,0);
    
    for (int i=0; i<n; i++){
        if (mn!=dus.func(i)){
            ans[i]=1;
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...