宁波工程学院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;
}