1、深度优先搜索遍历过程
图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。
- 基本思想:
假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
深度优先搜索是一个递归的过程
深度优先遍历特点是,选定一个出发点后进行遍历,能前进则前进,若不能前进,回退一步再前进,或再回退一步后继续前进。依此重复,直到所有与选定点相通的所有顶点都被遍历。
2、示例
对图7-25连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v3,v7,v4,v8,v2,v5,v6
对图7-26连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v3,v2,v4,v5,v6,v7
3、连通图的深度优先搜索遍历算法
- 基本思想:
给定一图G=<V,E>,用visited[i]表示顶点i的访问情况,初值设为0,表示所有顶点未被访问过,当顶点被访问过时置1。则初始情况下所有的visited[i]都为0。假设从顶点V0开始遍历,则下一个遍历的顶点是V0的第一个邻接点Vi,接着遍历Vi的第一个邻接点Vj,……直到所有的顶点都被访过。 - 算法描述(用邻接矩阵实现)
递归实现
#include<stdio.h>
#define MaxSize 10
typedef char VertexType;//节点类型
int visited[MaxSize] = {0};//标识该节点是否被访问
/*—————————图的构造———————————*/
typedef struct {
int edgeNum;//边数
int vertexNum;//节点个数
VertexType vertex[MaxSize];//存放点的一维数组
int edge[MaxSize][MaxSize]; //存放边的二维数组
}MGraph;
void init(MGraph *G);
void DFS(MGraph *G, int v);
/*—————————深度优先遍历——————————*/
void DFS(MGraph *G, int v){
printf("%c", G -> vertex[v]);
visited[v] = 1;
for(int i = 0; i < G -> vertexNum; i++)
if(G -> edge[v][i] == 1 && visited[i] == 0)
DFS(G,i);
}
void init(MGraph *G){
int i, j, k, R, C;
printf("输入顶点数和边数\n");
scanf("%d %d", & G -> vertexNum, &G -> edgeNum);
printf("输入顶点信息\n");
for(i = 0; i < G -> vertexNum; i++)
scanf(" %c", & G ->vertex[i]);//输入点的信息前面加个空格
//对存储边的信息数组进行初始化
for(i = 0; i < G -> vertexNum; i++)
for(j = 0; j < G ->vertexNum; j++)
G -> edge[i][j] = 0;
printf("输入边(vi, vj)的上标i,下标j\n");
for(k = 0; k < G -> edgeNum; k++){
// printf("-----------\n") ;
scanf("%d %d", &R, &C);
G->edge[R][C] = 1;
G->edge[C][R] = 1;
}
}
int main(){
MGraph MG;
init(&MG);
DFS(&MG, 0);
}