BFC与DFS原理介绍

文中程序摘自:https://blog.csdn.net/qq_36525906/article/details/77387717

DFS算法-Depth-First Search

深度优先搜索:

  • 遍历类似于树的先根遍历
  • 使用栈保存未被检测的结点,结点按照深度优先的顺序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测
  • 深度优先搜索举例:走迷宫,没有办法用分身术站姿每个走过的位置,不撞南墙不回头系列
  • 基本模板
int check(参数)
{
    if(满足条件)
        return 1;
    return 0;
}

void dfs(int step)
{
        判断边界
        {
            相应操作
        }
        尝试每一种可能
        {
               满足check条件
               标记
               继续下一步dfs(step+1)
               恢复初始状态(回溯的时候要用到)
        }
} 
#include<iostream>  
using namespace std;  

int a[11][11];  
bool visited[11];  

void store_graph()  //邻接矩阵存储图  
{  
    int i,j;  

    for(i=1;i<=10;i++)  
        for(j=1;j<=10;j++)  
            cin>>a[i][j];  
}  

void dfs_graph()    //深度遍历图  
{  
    void dfs(int v);  

    memset(visited,false,sizeof(visited));  

    for(int i=1;i<=10;i++)  //遍历每个顶点是为了防止图不连通时无法访问每个顶点  
        if(visited[i]==false)  
            dfs(i);  
}  

void dfs(int v)  //深度遍历顶点  
{  
    int Adj(int x);  

    cout<<v<<" ";  //访问顶点v  
    visited[v]=true;  

    int adj=Adj(v);  
    while(adj!=0)  
    {  
        if(visited[adj]==false)     
            dfs(adj);      //递归调用是实现深度遍历的关键所在  

        adj=Adj(v);  
    }  
}  

int Adj(int x)   //求邻接点  
{  
    for(int i=1;i<=10;i++)  
        if(a[x][i]==1 && visited[i]==false)  
            return i;  

    return 0;  
}  

int main()  
{  
    cout<<"初始化图:"<<endl;  
    store_graph();  

    cout<<"dfs遍历结果:"<<endl;  
    dfs_graph();  

    return 0;  
}  

BFS算法-Breadth-First Search

广度优先算法:

  • 遍历类似于树的按层次遍历
  • 使用队列保存未被检测的结点,结点按照宽度优先的顺序被方位和进出队列
  • 广度优先算法举例:当你的眼睛掉到地上后,趴在地板上找,总是先摸最接近自己的地方,如果没有再摸远一点的地方
#include<iostream>  
#include<queue>      
using namespace std;  

int a[11][11];  
bool visited[11];  

void store_graph()    
{  
    for(int i=1;i<=10;i++)  
        for(int j=1;j<=10;j++)  
            cin>>a[i][j];  
}  

void bfs_graph()      
{  
    void bfs(int v);  

    memset(visited,false,sizeof(visited));  

    for(int i=1;i<=10;i++)    
        if(visited[i]==false)  
            bfs(i);  
}  

void bfs(int v)  
{  
    int Adj(int x);  

    queue<int> myqueue;  
    int adj,temp;  

    cout<<v<<" ";  
    visited[v]=true;  
    myqueue.push(v);  

    while(!myqueue.empty())    //队列非空表示还有顶点未遍历到  
    {  
        temp=myqueue.front();  //获得队列头元素  
        myqueue.pop();         //头元素出对  

        adj=Adj(temp);  
        while(adj!=0)  
        {  
            if(visited[adj]==false)  
            {  
                cout<<adj<<" ";  
                visited[adj]=true;  
                myqueue.push(adj);   //进对  
            }  

            adj=Adj(temp);  
        }  
    }  
}  

int Adj(int x)     
{  
    for(int i=1;i<=10;i++)  
        if(a[x][i]==1 && visited[i]==false)  
            return i;  

    return 0;  
}  

int main()  
{  
    cout<<"初始化图:"<<endl;  
    store_graph();  

    cout<<"bfs遍历结果:"<<endl;  
    bfs_graph();  

    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/hi_baymax/article/details/82492442
BFC