zoukankan      html  css  js  c++  java
  • 图的遍历(bfs 和dfs)

    BFS的思想:
    从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1、V2、……Vn,然后依次访问与V1、V2……Vn相邻且未被访问的顶点。如此继续,找到所要找的顶点或者遍历完整个图。
    由此可以看出,用BFS进行搜索所搜索的顶点都是按深度进行扩展的,先找到到V0距离为1的所有顶点,然后找到距离V0为2的顶点……所以BFS所搜索到的都是最短的路径。

    由于要将距离V0为d(d>0)的且未被方位的点都记录起来,我们采用队列这种数据结构。队列的特点是先进先出(FIFO),从某个顶点出发,记此顶点已访问标记,然后依次搜索和此顶点相邻的且未被访问的顶点,将其加入队列,并置已访问标记,重复此步骤,直到找到需要搜索的顶点或者所有的顶点都被访问为止。

    参考代码

    void bfs(int k)
    {
        int v[N]={0},i;     //N表示图的顶点个数 
        queue<int> q;
        v[k]=1;             //访问标记为1
        q.push(k);
        while(!q.empty()){
            k=q.front();
            q.pop();
            for(i=0;i<N;i++)
                if(a[k][i]==1&&!v[i]){       //a[k][i]表示顶点k,和i有关系
                    q.push(i);
                    v[i]=1;
                }
        }
    }
    View Code

    DFS的思想:
    顾名思义,深度优先搜索所遵循的策略就是尽可能“深”的在图中进行搜索,对于图中某一个顶点V,如果它还有相邻的顶点(在有向图中就是还有以V为起点的边)且未被访问,则访问此顶点。如果找不到,则返回到上一个顶点。这一过程一直进行直到所有的顶点都被访问为止。 DFS可以搜索出从某一个顶点到另外的一个顶点的所有路径。 由于要进行返回的操作,我们采用的是递归的方法。

    int v[N]={0};
    void dfs(int k)
    {
        v[k]=1;
        for(i=0;i<N;i++)
            if(a[k][i]==1&&!v[i])
                dfs(i);
    }
    View Code


  • 相关阅读:
    Codeforces Round #624 (Div. 3) D. Three Integers
    Codeforces Round #624 (Div. 3) C. Perform the Combo(前缀和)
    Codeforces Round #624 (Div. 3) B. WeirdSort(排序)
    Codeforces Round #624 (Div. 3) A. Add Odd or Subtract Even(水题)
    洛谷P1130红牌(简单DP)
    洛谷P1044栈(DP)
    Codeforces 1315C Restoring Permutation
    MATLAB字符串处理
    MATLAB矩阵操作和算术运算符
    MATLAB基本概念和变量
  • 原文地址:https://www.cnblogs.com/happy-lcj/p/3855446.html
Copyright © 2011-2022 走看看