列表

详情


NC200435. 找朋友

描述


——你要是愿意,我就永远存在

某人的朋友圈实在是过于庞大且复杂,要判断两个人是不是朋友,那还真不容易。

现给出某个朋友圈关系图,求任意给出的两个人是否是朋友。

规定:如果xy是朋友,yz是朋友,那么xz也是朋友。

如果xy是朋友,那么x的朋友都是y的朋友,y的朋友也都是x的朋友。

输入描述

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

以下m行:每行两个数Mi, Mj,1 ≤ Mi, Mj ≤ n,表示Mi和Mj具有朋友关系。

接下来p行:每行两个数Pi ,Pj,询问Pi,Pj是否具有盆友关系

输出描述

P行,每行一个“Yes”或“No”(不包含引号)。表示第i个询问的答案为“具有”或“不具有”朋友关系。

示例1

输入:

6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6

输出:

Yes
Yes
No

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 44ms, 内存消耗: 2280K, 提交时间: 2019-12-16 11:04:32

#include<stdio.h>
#define N 50001
int son[N];
int find(int x)
{
	if(x==son[x]) return x;
	else return son[x]=find(son[x]);
}
int main()
{
	int i,n,m,p;
	scanf("%d%d%d",&n,&m,&p);
	for(i=1;i<=n;i++)
	son[i]=i;
	for(i=1;i<=m;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		son[find(a)]=find(b);
	}
	for(i=1;i<=p;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		if(find(a)==find(b)) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 151ms, 内存消耗: 1364K, 提交时间: 2020-05-22 19:09:36

#include<iostream>
using namespace std;
int f[100000];
int find(int k){
	if (f[k]==k) return k;
	return f[k]=find(f[k]);
} 
int n,m;
int q,a,b;
int main(){
	cin>>n>>m>>q;
	for (int i=1;i<=n;i++){
		f[i]=i;
	}
	for (int i=0;i<m;i++){
		cin>>a>>b;
		f[find(a)]=find(b);
	}
	for (int i=0;i<q;i++){
		cin>>a>>b;
		if (find(a)==find(b)){
				cout<<"Yes"<<endl;
			}
			else{
				cout<<"No"<<endl;
			}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 115ms, 内存消耗: 868K, 提交时间: 2019-12-15 14:15:23

#include<bits/stdc++.h> 
using namespace std;
int n,m,p,f[50001],x,y;
int find(int d)
{
	if(f[d]==d) return d;
	f[d]=find(f[d]);
	return f[d];
}
int main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=n;++i) f[i]=i;
	for(int i=1;i<=m;++i)
	{
		cin>>x>>y;
		x=find(x);
		f[find(y)]=x;
	}
	for(int i=1;i<=p;++i)
	{
		cin>>x>>y;
		if(find(x)==find(y)) printf("Yes\n");
		else printf("No\n");
	}
}

上一题