嵌入式linux c 学习笔记4-深度优先搜索和广义优先搜索

2019-07-13 06:50发布

/*
 * =====================================================================================
 *
 *       Filename:  dfs.c
 *
 *    Description:  dfs 深度优先搜索,bfs 广义优先搜索
 *
 *        Version:  1.0
 *        Created:  2010年10月27日 22时08分27秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Yang Shao Kun (), cdutyangshaokun@163.com
 *        Company:  College of Information Engineering of CDUT
 *
 * =====================================================================================
 */
深度优先搜索:重图的概念引发出来的。
                 我们从图中的某一个起始点v开始,访问他的任何一个邻接点w,然后
              在从w出发,访问w的邻接点(没有访问过的)w2,然后在从w2开始,进
              行类似的访问,直到所用的邻接点都被访问后为止。接着,退回一步,
              退到前一次刚被访问的节点,看,它还有没有没有被访问的邻接点。重
              复以上步骤,直到所有的顶点都被访问后结束。

算法实现:
void dfs(algraph *g,int v)
{
    arcnode *p;
    visited[v]=1;/*置已经访问标记*/
    printf("%d ",v);/* 输出被访问的节点编号*/
    p=g->adjlist[v].firstarc;/*p指向顶点v的第一条连线的结点*/
    while(p!=NULL)
    {
        if(visted[p->adjvex]==0)/*若节点p->adjvex没有访问,递归访问它*/
            dfs(g,p->adjvex);
        p=p->nextarc;
    }
}
用到的数据结构有:
typedef struct {
                Adjlist adjlist;/*邻接表*/
                int n,e;/*图中顶点数和边数*/
                }algraph;/*图的类型*/
typedef struct Vnode{
                     int data;/*int可以更换*/
                     arcnode *firstarc;/*指向第一条弧*/
                }vnode;
typedef vnode adjlist[max];/*adjlist 是邻接表型*/
typedef struct anode{
                        int adjvex;/*该弧点的终点位置*/
                        struct anode *nextarc;/*指向下一条弧的指针*/
                    }arcnode

回溯:在探索问题的时候走进了死胡同,则需要退回来,重例外的一条路开始。



广度优先搜索:首先访问初始点v1,接着访问v1的所有未访问过的领结点,v2,v3,,,,vt,然后在按照v1,,,vt的次序,访问每一个顶点的所有未被访问的邻接点,直到所有的顶点都被访问后结束。
所以,这个数据结构类似于------队列。
void bfs(algraph *g,int v)
{
    arcnode *p;
    int queue[max],front=0,rear=0;/*定义循环队列并初始化*/
    int visited[max];/*定义存放结点的访问标志的数组*/
    int w,i;
    for(i=0;in;i++)
        visited[i]=0;/*访问标志数组初始化*/
    printf("%d",v);
    visited[v]=1;
    rear=(rear+1)%max;
    queue[rear]=v;/*v进队*/
    while(front!=rear)
    {
        front=(front+1)%max;
        w=queue[front];
        p=g->adjlist[w].firstarc;/*找与顶点w邻接的第一个顶点*/
        while(p!=NULL)
        {
            if(visted[p->adjvex]==0)/*如果当前的节点没有被访问*/
            {
                printf("%d",p->adjvex);/*访问当前的节点*/
                visited[p->adjvex]=1;/*置该顶点已被访问标志*/
                rear=(rear+1)%max;/*该顶点进队*/
                queue[rear]=p->adjvex;
            }
            p=p->nextarc;/*找下一个邻接顶点*/
        }
    }
printf("/n");
}

广度优先搜索能找到最短的路径。