深度优先(DFS)与广度优先(BFS)

I.            图的遍历

在数据结构中,图是比较常用的数据储存方式,同树结构一样,图的核心在于遍历的方法上,对于图的遍历,一般有两种方式,一种是深度优先遍历,一种是广度优先遍历。

II.           深度优先遍历(DFS

深度优先是指设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(xy)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(xy)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新的顶点,继续遍历。

简单来讲,深度优先遍历可以理解为一个人开着汽车,从一点开始,接着寻找这点能够到达的其他点,若有,则开车到这个点,接着虚招下一个点,直到所有点都遍历完。

代码实现

intvisit[20]={0};               //路径访问数组

intmap[20][20];              //领接矩阵

void DFS(int xuhao , int n )     //顶点序号及顶点数

{

    visit[xuhao]=1;

    int i;

    for( i = 0 ; i < n ; i++ )

    {

        if(visit[i]==0&&map[xuhao][i]!=0 )

            DFS(i,n);

    }

}

III.         广度优先遍历(BFS

从图中某个顶点V0出发,并访问此顶点;从V0出发,访问V0的各个未曾访问的邻接点W1W2…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;重复上述步骤,直到全部顶点都被访问为止。

        简单来讲,广度是范围型搜索,及确定好一个顶点过后,寻找与它距离最近的

集合,然后再继续寻找,直到所有点都遍历完。

代码实现

intvisit[20]={0};                      //需要使用栈记录被访问顶点信息

intmap[20][20];

int tou =0,wei=0,dui[100];

 

void BFS(int x , int n )

{

    dui[wei]=x;

    int i ;

    wei++;

    visit[x]=1;

    while( tou!=wei )

    {

        for( i = 0 ; i < n ; i++ )

        {

            if(visit[i]==0&&map[dui[tou]][i]!=0 )

            {

                cout<<s[i];

                visit[i]=1;

                dui[wei]=i;

                wei++;

            }

        }

        tou++;

    }

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值