oj-【基础图论】亲戚

题目描述

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易。 现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 我们规定:如果x和y是亲戚,y和z是亲戚,那么x和z也是亲戚;如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。

输入

第一行:三个整数n,m,p,(n≤5000,m≤5000,p≤5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 以下m行:每行两个数Mi,Mj,1≤Mi,Mj≤N,表示Ai和Bi具有亲戚关系。 接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。

输出

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

提示

 

 

这是一道比较简单的并查集的题目=-=

(当然是在学过并查集之后才知道的..)

what is 并查集?

有些题目看起来完全可以用floyed(虽然看到那个e我也是很不爽的)判断到底是否连通..

然而数据太大数组开不下还可能超时~

所以就用并查集了..

然后...就是在那里找爸爸~找爸爸~一直找到老祖宗~~~

然后看代码吧...

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

#include

int n,m,p,f[5005],c;

int ft(int x)

{

    if(f[x]==x) return x;

    f[x]=ft(f[x]);

}

void mg(intx/*,int y*/)

{

    /*int q=ft(x),r=ft(y);

    //if(ft(x)==ft(y)) return;

    f[y]=f[r]=q;*/

    if(f[x]==x)

    {

        f[x]=c;

        return;

    }

    mg(f[x]);

    f[x]=c;

}

int main()

{

    int i,x,y;

    scanf("%d%d%d",&n,&m,&p);

    for(i=1;i<=n;i++)

        f[i]=i;

    for(i=1;i<=m;i++)

    {

        scanf("%d%d",&x,&y);

        c=ft(y);

        mg(x/*,y*/);

    }

    for(i=1;i<=p;i++)

    {

        scanf("%d%d",&x,&y);

        if(ft(x)==ft(y))printf("Yes\n");

        elseprintf("No\n");

    }

}

/**************************************************************

    Problem: 1081

    User: dogeding

    Language: C++

    Result: 正确

    Time:4 ms

    Memory:1108 kb

****************************************************************/

 

然而这份代码似乎好像貌似和书上讲得不太一样...

 

反正不都是合并吗= =

然后就没有然后了..

你可能感兴趣的:(懵逼了半天终于AC,并查集)