-
Description
-
第一行输入正整数n,m,q表示一个有n个点m条边的无向图。q表示有q次询问。
-
接下来m行有m条边。每行两个u,v属于[1,n]范围的正整数,表示u,v之间有边。
-
接下来q行,每行两个点u,v,属于[1,n]。
-
如果(u,v)这条边已经存在或者如果加入这条边后会产生新的环,则输出一行YES,否则输出NO.
-
-
Input
5 3 3
1 2
2 3
3 1
1 2
3 4
4 5
-
Output
YES
NO
NO
-
代码部分:
#include <stdio.h>
#define maxnum 10000000
#define maxarray 1000
int n,m,q;
int pre[maxnum];
int find(int x){
while(pre[x] != x){
x = pre[x];
}
return x;
}
void join(int x,int y){
int fx = find(x);
int fy = find(y);
if(fx != fy){
pre[fx] = fy;
}
}
int main(){
scanf("%d%d%d", &n, &m, &q);
for(int i= 0;i<n;i++){
pre[i] = i;
}
for(int i=0;i<m;i++){
int tmp1,tmp2;
scanf("%d%d", &tmp1, &tmp2);
join(tmp1, tmp2);
}
for(int i=0;i<q;i++){
int tmp1,tmp2;
scanf("%d%d", &tmp1, &tmp2);
if(find(tmp1) == find(tmp2)){
printf("YES\n");
}
else{
printf("NO\n");
}
}
}
须注意,本文中并查集算法采用的是合并树算法即采用kruskal算法,将每个节点是做一颗独立的树,再判定将不是同一根节点的树合并。
11万+

被折叠的 条评论
为什么被折叠?



