特点:
1, 都有一个数组保存它的根节点
2, 用vis数组保存其是否访问过
3, 如果cnt=1;说明该图是连通的。连通图中只有根节点的父节点是自身,cnt应该是1
解决的题目:
1,题目已经给了图上顶点之间的关系,通过顶点之间的关系,求连通分量的个数。
#include "stdio.h"
int bin[1002];
int ans=1;
int findx(int x)//找x的根结点
{
intr=x;
while(bin[r] !=r)
r=bin[r];
return r;
}
//通过两点间的关系,构造一棵有根数
void merge(int x,int y)//使x指向y,合并x,y
{
intfx,fy;
fx= findx(x);
fy= findx(y);
if(fx != fy)
bin[fx] = fy;
elseans=0;//ans=0;说明图存在回路。
}
int main()
{
intn,m,i,x,y,count;
while(scanf("%d",&n),n)
{
for(i=1;i<=n;i++)//初始化bin数组,每个结点分别属于不同集合
bin[i] = i;
for(scanf("%d",&m);m>0;m--)
{
scanf("%d %d",&x,&y);
merge(x,y);//合并x,y;
}
for(count=-1, i=1;i<=n;i++)
if(bin[i] == i)
count++;
printf("%d\n",count);
}
}
2,可以求给定的图中顶点的关系中,所有顶点间是否存在回路问题。(如果两个顶点的根节点相同,则这两个顶点存在回路)
1,判断有无回路
2,判断是否连通