编写一个程序,读取 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;
}