zoukankan      html  css  js  c++  java
  • 图的深度优先遍历和广度优先遍历

    #include <iostream>
    #include <cstdlib>
    #include <set>
    #include <vector>
    #include <list>
    #include <stack>
    #include <queue>
    using namespace std;

    //BFS 广度优先遍历
    void bfs(vector< list<int> >& adj_lists,int start_node)
    {
     queue<int> not_yet_explored;
     set<int> discovered;
     
     //标记起始结点为已被发现,并将其放入队列中开始探索
     not_yet_explored.push(start_node);
     discovered.insert(start_node);
     
     while(!not_yet_explored.empty())
     {
      //获得一个新结点并依此作为基点进行探索
      int node_to_explore = not_yet_explored.front();
      not_yet_explored.pop();
      
      //检测该结点的所有边
      list<int>::iterator edges = adj_lists[node_to_explore].begin();
      for (;edges != adj_lists[node_to_explore].end();edges++)
      {
       if (discovered.count(*edges)==0)
       {
        //发现新结点将其加入队列
        discovered.insert(*edges);
        not_yet_explored.push(*edges);
        cout<<"Found "<<*edges<<" from "<<node_to_explore<<endl;
       }
      }
     }
    }

    //DFS 深度优先遍历
    void dfs_helper(vector< list<int> >& adj_lists,set<int>& discovered,int node)
    {
     //检测该结点的所有边
     list<int>::iterator edges = adj_lists[node].begin();
     for (;edges != adj_lists[node].end();edges++)
     {
      //检测某条边是否含有未发现的顶点
      if (discovered.count(*edges) == 0)
      {
       discovered.insert(*edges);
       cout<<"Found "<<*edges<<" from "<<node<<endl;
       dfs_helper(adj_lists,discovered,*edges);
      }
     }
    }

    void dfs(vector< list<int> >& adj_lists,int start_node)
    {
     //标记起始结点为已被发现
     set<int> discovered;
     discovered.insert(start_node);
     dfs_helper(adj_lists,discovered,start_node);
    }

    int main()
    {
     //初始化图信息
     vector< list<int> > g(7,list<int>());
     g[0].push_back(2);
     g[0].push_back(1);
     
     g[1].push_back(0);
     g[1].push_back(2);
     
     g[2].push_back(4);
     g[2].push_back(3);
     g[2].push_back(0);
     g[2].push_back(1);
     
     g[3].push_back(2);
     g[3].push_back(4);
     
     g[4].push_back(6);
     g[4].push_back(5);
     g[4].push_back(3);
     g[4].push_back(2);
     
     g[5].push_back(4);
     g[5].push_back(3);
     
     g[6].push_back(4);
     
     cout<<"BFS"<<endl;
     bfs(g,0);
     
     cout<<endl<<"DFS"<<endl;
     dfs(g,0);
     
     return 1;
    }

  • 相关阅读:
    详解CSS中:nth-child的用法
    网站哀悼变灰代码集合 兼容所有浏览器的CSS变暗代码
    简单CSS3实现炫酷读者墙
    CSS常用浮出层的写法
    五种方法让CSS实现垂直居中
    网页前端开发:微博CSS3适用细节初探
    CSS代码实例:用CSS代码写出的各种形状图形
    10个CSS简写及优化技巧
    25个站长必备的SEO优化工具
    40个让你的网站屌到爆的jQuery插件
  • 原文地址:https://www.cnblogs.com/fuyanan/p/3029325.html
Copyright © 2011-2022 走看看