并查集典型的一个例题是朋友圈问题 > A和B是朋友,B和C是朋友,那么A和C也是朋友,即朋友的朋友也是朋友

输入格式

第一行:三个整数 n,m,p(n≤5000,m≤5000,p≤5000)分别表示有n 个人,m 个朋友关系,询问p 对朋友关系。

接下来 m 行:每行两个数Ai,Bi1≤Ai,Bi≤N,表示Ai​ 和 Bi具有朋友关系。接下来 p 行:每行两个数,询问两人是否为朋友。

#include<iostream>  
#include<algorithm>  
#include<string.h>  
using namespace std;  
int mark[5005],fa[5005];  
int get(int x) // 查询父节点
{  
    if(fa[x]==x)
        return x;  
    return fa[x]=get(fa[x]);  
}  
int main()
{  
    int n,m,p;
    cin>>n>>m>>p;  
    int a,b;   
    memset(mark,0,sizeof(mark)); //初始都不是朋友
    for(int i=1;i<=n;i++)
        fa[i]=i;  //父节点设为自己
    while(m--)
    {  
        cin>>a>>b;  
        a=get(a);  
        b=get(b);  
        if(a!=b) // 不是同一个父节点
        {  
            fa[a]=b;  // 指向同一个父节点
        }  
    }  
    for(int i=1;i<=p;i++)
    {  
        cin>>a>>b;  
        a=get(a);
        b=get(b);  
        if(a==b)
            mark[i]=1;  //是朋友标记为1
    }  
    for(int i=1;i<=p;i++)
    {  
        if(mark[i])
            cout<<"Yes"<<endl;  
        else 
            cout<<"No"<<endl;  
    }  
    return 0;  
}