题解 | #1007.Solubility# 2023杭电暑期多校8

1007.Solubility

并查集/DFS

题目大意

给定 n n n 个元素之间的 m m m 对等价关系,问指定 k k k 个元素是否属于同一等价类

解题思路

这里给出两种解题思路:

  1. DFS:建无向图,DFS判断指定元素是否在同一个连通分量里
  2. 并查集:标准并查集板子题,裸套即可

参考代码

参考代码为已AC代码主干,其中部分功能需读者自行实现

  1. DFS
#define N 100005
int visited[N]={0};
vector> G;
void DFS(ll x){
    visited[x]=1;
    for(auto v:G[x]){
        if(!visited[v]) DFS(v);
    }
}
void solve()
{
    ll m,n;cin >> n >> m;
    G.clear();G.resize(n+1);
    FORLL(i,1,n) visited[i]=0;
    ll u,v;
    FORLL(i,1,m){
        cin >> u >> v;
        G[u].emplace_back(v);
        G[v].emplace_back(u);
    }
    ll k;cin >> k;
    vector s(k);for(auto &x:s) cin >> x;
    DFS(s[0]);
    for(auto x:s) if(!visited[x]) {cout << NO;return ;}
    cout << YES;
}
  1. 并查集
void solve(){
    ll n,m;cin >> n >> m;
    DSU dsu(n);
    ll a,b;
    FORLL(i,1,m){
        cin >> a >> b;
        dsu.merge(a,b);
    }
    ll k;cin >> k >> a;a=dsu.find(a);
    FORLL(i,2,k){
        cin >> b;b=dsu.find(b);
        if(b!=a) {cout << NO;FORLL(j,i+1,k) cin >> n;return ;}
    }cout << YES;
}

你可能感兴趣的:(2023杭电多校,深度优先,算法)