算法题 朋友
在社交的过程中,通过朋友,也能认识新的朋友。在某个朋友关系图中,假定 A 和 B 是朋友,B 和 C 是朋友,那么 A 和 C 也会成为朋友。即,我们规定朋友的朋友也是朋友。
现在,已知若干对朋友关系,询问某两个人是不是朋友。
请编写一个程序来解决这个问题吧。
输入格式
第一行:三个整数 n,m,p,分别表示有 n 个人,m 个朋友关系,询问 p 对朋友关系。
接下来 m 行:每行两个数 A和B,表示 A 和 B 具有朋友关系。
接下来 p 行:每行两个数,询问两人是否为朋友。
输出格式
输出共 p 行,每行一个Yes或No。表示第 i 个询问的答案为是否朋友。
样例输入
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
样例输出
Yes
Yes
No
解题思路:采用并查集实现
#include<iostream>
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stack>
using namespace std;
int n,m,p,father[6000];
int get(int x)
{
if(father[x]==x)
{
return x;
}
return father[x]=get(father[x]);//找到最终的父节点
}
void merge(int x,int y)//合并操作
{
x=get(x);
y=get(y);
if(x!=y)
{
father[y]=x;
}
}
int check(int x,int y)//检查
{
if(get(x)==get(y))
{
return 1;
}else
{
return 0;
}
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
{
father[i]=i;//刚开始每一个节点的父节点 都是自身
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
merge(x,y);//合并操作
}
for(int i=1;i<=p;i++)
{
int q1,q2;
cin>>q1>>q2;
if(check(q1,q2))
{
printf("Yes\n");
}else
{
printf("No\n");
}
}
return 0;
}
Java实现
import java.util.*;
public class Main {
static int []father=new int[1000];
static int get(int x){
if(x==father[x])
return x;
//else return father[x]=get(father[x]);//to-do
else return get(father[x]);//应该这样子 找出父节点
}
static void merge(int x,int y){
x=get(x);
y=get(y);
if(x!=y)
father[y]=x;
}
static int check(int x,int y){
x=get(x);
y=get(y);
if(x==y)
return 1;
else return 0;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int p=scan.nextInt();
for(int i=1;i<=n;i++)
father[i]=i;
for(int i=1;i<=m;i++){
int x=scan.nextInt();
int y=scan.nextInt();
merge(x,y);
}
for(int i=1;i<=p;i++){
int x=scan.nextInt();
int y=scan.nextInt();
if(check(x,y)==1)
System.out.println("Yes");
else System.out.println("No");
}
}
}