1. 非连通图的遍历
非连通图的遍历策略:
从每个连通分量中选择初始点,分别进行遍历,才能够访问图中的所有顶点。
图1-非连通图的遍历
在图1中的非连通图有2个连通分量,我们可以从每个连通分量选择任意一个顶点作为初始点开始遍历,把所有的顶点都遍历完毕,但是在遍历之前,我们需要去指定初始点,因此从一个连通分量中的任何一个顶点开始遍历,当遍历结束,说明这个连通分量中的所有顶点都已访问完毕。于是接下来再找任意一个没有访问过的顶点就是另一个连通分量中的顶点了,而通过这种思路,我们就可以遍历另一个连通分量,直到把整个图全部遍历完毕。
算法实现:
//采用深度优先搜索遍历非连通无向图
DFS1(ALGraph *G)
{
int i;
for (i=0;i<G->n;i++)
if (visited[i]==0)
DFS(G,i);
}
深度优先搜索遍历非连通无向图,算法调用过程:
采用深度优先搜索遍历非连通无向图,遍历每一个顶点,当i = 0时,以顶点0为起始点遍历时,对应的顶点1,顶点2,顶点3,顶点4都会依次被访问。当DFS1中的i = 1时,由于顶点1已经访问过,所以不会再执行DFS算法了。
当i = 5时,由于顶点5没有访问过,因此会执行DFS,以顶点5为起始顶点开始遍历另一个连通分量。
广度优先搜索遍历非连通无向图算法也是如此:
//采用广度优先搜索遍历非连通无向图
BFS1(ALGraph *G)
{
int i;
for (i=0;i<G->n;i++)
if (visited[i]==0)
BFS(G,i);
}
2. 应用——判断是否是连通图
问题:假设图G采用邻接表存储,设计一个算法,判断无向图G是否是连通图。若连通则返回true;否则返回false。
思路:参考非连通图遍历的思路,以深度优先搜索图,从任一顶点开始一次遍历,所有顶点均已经遍历,这时visited数组中所有的元素值都是为0的,那么这就是连通图,如果visited数组中有元素的值不为0,那么这就不是连通图。
算法实现:
int visited[MAXV];
bool Connect(ALGraph *G)
{
int i;
//设置默认值
bool flag=true;
//初始化visited数组
for (i=0; i<G->n; i++)
visited[i]=0;
//以顶点0为起始点开始遍历
DFS(G,0);
//判断所有顶点是否已经被访问
for (i=0; i<G->n; i++)
//如果有一个顶点没有被访问,说明这不是连通图,则更改flag标志
if (visited[i]==0)
{
flag=false;
break;
}
return flag;
}