深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次 。

需要注意的关键词:一条路走到黑、回溯、邻接矩阵、辅助数组。

深度优先搜索的内容体现在遍历上,下面是最基础最简单的无向图的遍历方法。

图如下:

简例浅析深度优先搜索(Depth-First-Search)

代码如下(含注释):

#include <iostream>
#include <algorithm>
using namespace std;

 void dfs(int v,int visit[],int neigh[][7])
{
    cout << v;
    visit[v] = 1;//标记已到达
    for(int i=0;i<7;i++)
    {
        if(neigh[v][i]!=0&&visit[i]!=1)//顺序查找没去过的相邻接点
        {
            dfs(i,visit,neigh);//递归
        }
    }
}

int main()
{
    int neighbor[7][7] = {{0,1,1,0,0,0,0},{1,0,0,1,1,0,0},{1,0,0,0,0,1,1},{0,1,0,0,0,0,0},{0,1,0,0,0,1,0},{0,0,1,0,1,0,0},{0,0,1,0,0,0,0}};//建立邻接矩阵
    int visited[7] = {0,0,0,0,0,0,0};//建立辅助数组
    dfs(0,visited,neighbor);
    return 0;
}

使用邻接表遍历:

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct ListNode
{
    int nei;
    struct ListNode * next;
}Nei;

Nei* Creat(int n)
{
    Nei * head = new Nei; //建立头链表
    Nei * pre = head; //存储上一链表
    for(int i = 0; i < n; i++)
    {
        Nei * p = new Nei;
        cin >> p->nei;
        pre->next = p;
        pre = p;
        p->next = NULL;
    }
    return head;
}

 void dfs(int v,int visit[],Nei* neilist[])
{
    cout << v;
    visit[v] = 1;//标记已到达
    Nei* p = neilist[v];
    while(p->next!=NULL)//仍有下一个邻接点
    {
        if(visit[p->nei]!=1)//没访问,访问
        {
            dfs(p->nei,visit,neilist);
        }
        else//访问了,下一个
        {
            p = p->next;
        }
    }
        if(visit[p->nei]!=1)//最后一个邻接点的处理
    {
        dfs(p->nei,visit,neilist);
    }
}

int main()
{
    int visited[7] = {0,0,0,0,0,0,0};//建立辅助数组
    int neinum[7] = {2,3,3,1,2,2,1};//邻接点数
    Nei* neilist[7];//建立邻接表
    for (int i = 0;i < 7;i++)
    {
        cout << "创建第" << i << "个节点的链表" << endl;
        neilist[i] = Creat(neinum[i])->next;//存入1节点
    }

    dfs(0,visited,neilist);
    return 0;
}

输出:0134526

非递归做法介绍:

void bfs()
{
    stack<int> s;
    s.push(head);
    visit[v]=true;
    while(!s.empty())
    {
        v=s.top();
        if(该节点邻接表不为空)
        {
            s.push(arr[0]);
            visit[arr[0]]=true;
        }else
        {
            pop(v)
        }
    }
}
分类: 计算机

Reason

在漫漫梦路上踽踽独行的人……

1 条评论

1 · 2019年11月3日 下午9:52

water

发表回复

Avatar placeholder