深度优先遍历
1 连通图深度优先遍
1) 从图中的某一个顶点V出发,访问此顶点,然后从和V相连但是没有被访问过的顶点出发,深度先遍历图,直到将和V连通的所有顶点被访问完为止
2 非连通图深度优先遍历
1) 从图中的某一个顶点V出发,访问此顶点,然后从和V相连但是没有被访问过的顶点出发,深度先遍历图,直到将和V连通的所有顶点被访问完为止
2) 若此时图中还有顶点未被访问,则任选其中的一个顶点出发,重复1)的步骤,直到图中所有的顶点被访问完
3 深度优先搜索比喻:
如果在家里找东西,有四个卧室,深度优先就是,将一个卧室彻彻底底的找一遍,然后再找另外的一个卧室,以此下去
4 代码解析
1) 邻接矩阵存储结构
typedefint Boolean;
Boolean visited[Max]; //记录顶点是否被访问过
void DFS(MGraph G,inti)
{
int j;
visited[i] = TRUE; //首先,将顶点标识为“已访问”
cout <<G.vexs[i] << endl; //输出顶点信息也可以是其他的操作 比如比较
for(j = 0; j <G.numVertex; j++)
{
if(G.arc[i][j] == 1&& !visited[j]) //当顶点j 与 顶点i 有连通时,并且没有被访问
{
DFS(G,j); //递归深度遍历顶点j的下一个连通并且没有被访问过的顶点
}
}
}
voidDFSTraverse(MGraph G)
{
int i;
for(i = 0; i <G.numVertex; i++) //初始化visited数组,所有顶点都是未访问过的
{
visited[i]= FALSE;
}
for(i = 0; i <numVertex; i++) //开始深度搜索图中所有的顶点
{
if(!visited[i]) //如果顶点没有被访问,则访问,否则不访问
{
DFS(G,i); //将图的结构体指针、当前顶点下标传进去
}
}
}
2) 邻接表存储结构
void DFS(GrapgAglistG,int i)
{
int j;
EdgeNode *p; //指向下一条边的指针
visited[i] = true;
cout <<G->adjust[i].data;
p =G->adjust[i].firstedge; //给p赋值,顶点i 的下一条边
/* 因为邻接表中的所有边都是直接直接通过指针连接起来的,所有不需要用遍历的方式,而是判断当前顶点的下一条边是否存在
for(j = 0; j < G.numVertex; j++)
{
if(!visited[i]&& p==G->adjust[j].firstedge)
{
DFS(G,j);
}
}*/
//因为邻接表中的所有边都是直接直接通过指针连接起来的,所有不需要用遍历的方式,而是判断当前顶点的下一条边是否存在
while(p)
{
if(!visited[p->adjvex])
{
DFS(G,p->adjvex);
}
p = p->next;
}
}
voidDFSTraverse(GrapgAglist G)
{
int j;
for(j = 0; j <G.numVertex; j++)
{
visited[j] = false;
}
for(j = 0; j <G.numVertex; j++)
{
if(!visited[j])
{
DFS(G,j);
}
}
}
5 注意点:
1) 存储深度遍历信息的结构:
a) visited[Max]数组,存储顶点是否被访问的信息,TRUE FALSE
b) G 图结构体指针,其中有图的边、顶点个数,邻接矩阵,边的信息
c) i 深度遍历的起点
2) 判断是否遍历的条件:
a) 是否已经被访问过
b) 是否和当前顶点连通
3) 信息的变化:一旦确定可以访问,转到DFS函数中,要将顶点标记为已访问的
部分代码摘抄自《大话数据结构》