宁波工程学院2020新生校赛L - 小梁的道馆(基础并查集)

链接:https://ac.nowcoder.com/acm/contest/6106/L
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小梁变强之后决定建设自己的道馆,她特别喜欢去其他的道馆串门。
但是有些道馆之间没有道路连通,于是小梁想知道自己能不能去她想去的道馆,
你能帮她写一个程序来查询两个道馆之间是否互相存在道路联通吗;
如果存在输出“YES”,反之输出“NO”。

输入描述:

第一行为三个整数N为道馆个数,M为线路条数,T为查询次数(1≤N<1000,1≤M<1000,1≤T<10000)
第二行至第M+1行,每行两个整数,代表两个道馆的编号a,b(1≤a≤1000,1≤b≤1000),表示这两个道馆之间有道路相连
第M+2行至第M+T+2行,每行两个整数,代表查询这两个道馆。

输出描述:

T行,每行对应一个查询,假如查询的道馆之间可以连接则输出YES,否则则输出NO。
示例1
输入
4 2 2
1 3
4 3
1 2
3 4
输出
NO
YES

题目大意:

输入N M T 表示有n个道馆,M条通路,T个询问,每次询问两个道馆是否相连。

解题思路:

基础并查集,每次都连边,询问时find(a) == find(b)则说明相连,并查集模板即可解题。AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1e3+50;
int f[N];
int n,t,m,a,b;
void init()//初始化 自己是自己的父节点
{
	for(int i=0;i<=n;i++)
	  f[i]=i;
}
int find(int x)//寻根+路径压缩
{
	return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y)//合并
{
	f[find(y)]=find(x);
}
int main()
{
	cin>>n>>t>>m;
	init();
	for(int i=1;i<=t;i++)
	{
		cin>>a>>b;
		merge(a,b);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b;
		cout<<(find(a)==find(b)?"YES":"NO")<<endl;
	}
	//system("pause");
	return 0;
}
posted @ 2020-06-21 10:25  Hayasaka  阅读(71)  评论(0编辑  收藏  举报