数据结构——图的遍历之深度优先遍历
图的遍历一般分为深度优先遍历和广度优先遍历
下面我们要说的是深度优先遍历**(DFS算法)**
1,我们首先选择一个顶点作为起始点,假设我们选择顶点v作为起始点,首先访问v,然后找v的邻接点,访问v的一个还未被访问过邻接点w1,
2,再以w1为起始点,然后去找w1的邻接点,访问w1的一个还未被访问过的邻接点w2,再以w2作为起始点继续往下访问…
3,如果我们访问到一个顶点,以他作为起始点选择他的邻接点时发现他的邻接点全部都被访问过或者说他没有邻接点了,这个时候就返回到这个顶点的上个顶点,以上个顶点作为起始点继续访问。
我们假设访问完w9之后,发现w9的邻接点全部都被访问过或者w9没有邻接点了,那这个时候我们就返回到w9的上个顶点w8,以w8作为起始点继续往下访问,如果w8也没有未被访问的邻接点了,那就再返回上个顶点w7,以此类推,直到所有的顶点都被访问一遍为止。
这里值得注意的是 我们以一个顶点为起始点去找他的邻接点的顺序一定要统一,
比如说上题以2为起始点,我们选择1为他的第一个邻接点去访问1,然后再以1为起始点,1的邻接点有3和4 由于以2为起始点的时候选择1作为第一起始点顺序是按从小到大的,那我们以1为起始点的时候就要首先选择访问3,有更多个邻接点依旧如此,第一第二第三…邻接点的顺序要从小到大都按从小到大,要从大到小都按从大到小。
出现这种情况原因主要是因为在写代码的时候,访问下个邻接点的代码是一样的,每次都是执行相同的语句,所以顺序都是统一的。
【算法思想】
1,设立一个辅助数组visited[i]来储存已经被访问过的顶点
2,确定一个起始点v,输出v,并将v放入数组visitde之中
3,利用循环语句去寻找v的第一个邻接点w,判断w是否被访问过即visited[w]是否为0
4,若w未被访问过即visited[w]=0,则以w为新的起始点重复2,3
若w已经被访问过了 则继续找v未被访问过的邻接点,重复以上步骤
5,如果我们在找一个顶点的邻接点时其没有邻接点或者所有的邻接点都已经被访问过,则返回上个顶点重复以上步骤
综上,我们可以用递归的方式
用邻接矩阵储存图结构的DFS算法
#include<iostream>
using namespace std;
#define imax 9999
#define max 100
#define true 1
#define false 0
typedef char dingdian;
typedef int quanzhi;
typedef struct{
dingdian dd[max];//建立顶点表
quanzhi lj[max][max];//创建邻接矩阵
int ds,bs;//顶点数和边数
}Tu;
int look(Tu G,dingdian v)//寻找顶点下标的函数
{
int i;
for(i=0;i<G.ds;i++)
{
if(G.dd[i]==v)
return i;
}
}
void creattree(Tu &G)//建立图G
{
int i,j,k;
dingdian v1,v2;
quanzhi a;
cin>>G.ds>>G.bs;//输入顶点数和边数
for(i=0;i<G.ds;i++)
{
cin>>G.dd[i];//输入顶点信息
}
for(i=0;i<G.ds;i++)
{
for(j=0;j<G.ds;j++)
{
G.lj[i][