图的深度优先搜索和广度优先搜索
深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。
这个文章很清楚的讲了如何遍历
1. 列出联通集
BFS
BFStraverse()
{
int Q[VMAX];//用一维数组代替队列
int rear, front;//创建队列需要的两个参数
rear = front = -1;
int i, j, temp;
for (i = 0; i < Nv; i++)//将visited数组全都初始化为0
visited[i] = 0;
for (i = 0; i < Nv; i++)//找到每个独立联通集合的点
{
if (!visited[i])//如果从来未被访问过
{
printf("{ ");
Q[++rear] = i;
visited[i] = 1;
while (front < rear)//队列不为空时
{
temp = Q[++front];
printf("%d ", temp);//将队头元素出队
for (j = 0; j < Nv; j++)//遍历队头元素的邻接点
{
if (Graph[temp][j] && !visited[j])//如果从未被访问。则把该元素加入队列并记为访问
{
Q[++rear] = j;
visited[j] = 1;
}
}
}
printf("}\n");
}
}
}
DFS
DFS(int i)
{
visited[i] = 1;
printf("%d ", i);
for (int j = 0; j < Nv; j++)
{
if (Graph[i][j] && !visited[j])
DFS(j);
}
}
DFStraverse()
{
int i;
for (i = 0; i < Nv; i++)
visited[i] = 0;
for (i = 0; i < Nv; i++)
if (!visited[i])
{
printf("{ ");
DFS(i);
printf("}\n");
}
}