Cod sursa(job #2924526)

Utilizator Stormtrooper-007Vartic Rihard Stormtrooper-007 Data 4 octombrie 2022 11:01:28
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;
vector<int>adj[200005];
struct DSU{
vector<int>Rank;
vector<int>Parent;
 DSU(int n) {
    Rank.assign(n, 0);
    Parent.assign(n, 0);
    for(int i=0;i<n;i++) {
        Rank[i] = 1;
    }
    for(int i=0;i<n;i++) {
        Parent[i] = i;
    }
}
int getparent(int x) {
    if(x==Parent[x]) return x;
    return Parent[x]=getparent(Parent[x]);
}
void unite(int a, int b) {
    a = getparent(a);
    b = getparent(b);
    if (Rank[b]<Rank[a]) swap(a,b);
    if (Rank[a]==Rank[b]) Rank[b]++;
    Parent[a]=b;
}

bool check(int a,int b) {
    return getparent(a)==getparent(b);
}
};
int main()
{
    ifstream cin("closing.in");
    ofstream cout("closing.out");
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
    int a,b;
    cin>>a>>b;
    a--;
    b--;
    adj[a].push_back(b);
    adj[b].push_back(a);
}
vector<int>v(n);
vector<int>seen(n);
vector<int>f(n);
DSU h(n);
for(int i=n-1;i>=0;i--)
cin>>v[i];
int ma=0;
for(int i=0;i<n;i++)
{
    v[i]--;
    seen[v[i]]=1;
    int f2=0;
    int ok=0;
    for(int j=0;j<adj[v[i]].size();j++)
    {
        if(seen[adj[v[i]][j]]==1)
        {ok=1;
            if(h.getparent(adj[v[i]][j])!=h.getparent(v[i]))
            {
                f2+=f[h.getparent(adj[v[i]][j])];
                f[h.getparent(adj[v[i]][j])]=0;
                h.unite(v[i],adj[v[i]][j]);
            }
        }
    }
   // if(ok==0)
    f2++;
    int daddy=h.getparent(v[i]);
    f[daddy]+=f2;
    ma=max(ma,f[daddy]);
    //cout<<f[daddy]<<'\n';
    if(ma==i+1)
    {
        v[i]=1;
    }
    else
    {
        v[i]=0;
    }
   // cout<<v[i]<<" ";
}
for(int i=n-1;i>=0;i--)
{
    //cout<<v[i];
    if(v[i]==1)
    cout<<"YES";
    else
    cout<<"NO";
    cout<<'\n';
}
    return 0;
}