连通分量分解【东北大学oj数据结构11-4】C++

发布于:2025-02-11 ⋅ 阅读:(52) ⋅ 点赞:(0)

编写一个程序,读取 SNS(社交网络服务)中的关系,并判断给定的用户对通过网络是否彼此可达。

输入
在第一行,给出了两个整数 n 和 m。 n 是 SNS 中的用户数,m 是 SNS 中的关系数。 SNS 中的用户由编号由 0 ~ n-1。

在接下来的 m 行中,给出了关系。 每个关系由两个整数 s 和 t 给出,表示 s 和 t 是朋友(并且彼此可达)。

在下一行中,给出了查询的数量 q。

在接下来的 q 行中,分别给出了 q 个查询。 每个查询由两个整数 s 和 t 组成,由空格字符分隔。

输出
对于每个查询,如果 t 可以通过社交网络从 s 到达,则打印“yes”,否则打印“no”。

约束
2≤n≤100,000
0≤m≤100,000
1≤q≤10,000

输入样例

10 9
0 1
0 2
3 4
5 7
5 6
6 7
6 8
7 8
8 9
3
0 1
5 9
1 3

输出样例

yes
yes
no 

#include <iostream>
#include <vector>
 
using namespace std;
 
int findd(int parent[],int x)
{
    if(parent[x]!=x)
    {
        parent[x]=findd(parent,parent[x]);
    }
    return parent[x];
}
void unionsets(int parent[],int rankk[],int x,int y)
{
    int rootx=findd(parent,x);
    int rooty=findd(parent,y);
    if(rootx!=rooty)
    {
        if(rankk[rootx]>rankk[rooty])
        {
            parent[rooty]=rootx;
        }
        else if(rankk[rootx]<rankk[rooty])
        {
            parent[rootx]=rooty;
        }
        else
        {
            parent[rooty]=rootx;
            rankk[rootx]++;
        }
    }
}
int main() {
    int n,m;
    cin >> n>>m;
    int parent[n],rankk[n];
    for(int i=0;i<n;i++)
    {
        parent[i]=i;
        rankk[i]=1;
    }
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        unionsets(parent,rankk,a,b);
    }
 
    int q;
    cin>>q;
    for(int i=0;i<q;i++)
    {
        int a,b;
        cin>>a>>b;
        if(findd(parent,a)==findd(parent,b))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
 
    return 0;
}

 


网站公告

今日签到

点亮在社区的每一天
去签到