SDUT 1488 数据结构实验:连通分量个数

题目描述

 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图,
否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点个数极大。
例如:一个无向图有5个顶点,1-3-5是连通的,2是连通的,4是连通的,则这个无向图有3个连通分量。

输入

 第一行是一个整数T,表示有T组测试样例(0 < T <= 50)。每个测试样例开始一行包括两个整数N,M,(0 < N <= 20,0 <= M <= 200)
分别代表N个顶点,和M条边。下面的M行,每行有两个整数u,v,顶点u和顶点v相连。

输出

 每行一个整数,连通分量个数。

示例输入

2

3 1

1 2

3 2

3 2

1 2

示例输出

2

1

题目分析:简单的并查集问题,求出无向图能分出多少条互不连接的路径段。只需求出一共有几个不相同的根节点即可。

 1 #include<stdio.h>

 2 int bin[1000001];

 3 int findx(int x)

 4 {

 5     int r=x;

 6     while(bin[r]!=r)

 7         r=bin[r];

 8     return r;

 9 }

10 void merge(int x,int y)

11 {

12     int fx,fy;

13     fx=findx(x);

14     fy=findx(y);

15     if(fx!=fy)

16         bin[fx]=fy;

17 }

18 int main()

19 {

20     int n,m,i,x,y,h,j,count;

21     scanf("%d",&h);

22         for(j=1;j<=h;j++)

23     {

24         scanf("%d",&n);

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

26             bin[i]=i;

27         for(scanf("%d",&m);m>0;m--)

28         {

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

30             merge(x,y);

31         }

32         for(count=0,i=1;i<=n;i++)

33             if(bin[i]==i)

34             count++;

35         printf("%d\n",count);

36     }

37 

38 }

 




你可能感兴趣的:(数据结构)