图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)
#include<iostream>
#include<string>
#include<list>
#include<queue>
#include<stack>using namespace std;class Graph
{int n; //结点个数list<int> *adj; //邻接表
public:Graph(int _n){n = _n;adj = new list<int>[n];}~Graph(){delete adj;} void addEdge(int v, int w){adj[v].push_back(w); //默认为有向图 //adj[w].push_back(v); //无向图的话 }void DFSUtils(int s, bool *visited){visited[s] = true;cout<<s<<" ";list<int>::iterator it;for(it = adj[s].begin(); it != adj[s].end(); it++){if(!visited[*it]){DFSUtils(*it,visited);}} }void DFS(){bool *visited = new bool[n];for(int i = 0; i < n; i++){visited[i] = false;} for(int i = 0; i < n; i++){if(!visited[i]){DFSUtils(i,visited);cout<<";"; //每个连通分量用";"分隔 }}}void BFSUtils(int s,bool *visited){ queue<int> q;visited[s] = true;q.push(s);list<int>::iterator it;while(!q.empty()){s = q.front();q.pop();cout<<s<<" ";for(it = adj[s].begin(); it != adj[s].end(); it++){if(!visited[*it]){visited[*it] = true;q.push(*it);}} }} void BFS(){bool *visited = new bool[n];for(int i = 0; i < n; i++){visited[i] = false;}for(int i = 0; i < n; i++){if(!visited[i]){BFSUtils(i,visited);cout<<";"; //每个连通分量用";"分隔 }}}void DFSUtils_iter(int s,vector<bool> &visited){ stack<int> stk;stk.push(s);cout<<s<<" ";visited[s] = true; list<int>::iterator it;while(!stk.empty()){s = stk.top();stk.pop();for(it = adj[s].begin(); it != adj[s].end(); it++){if(!visited[*it]){stk.push(*it);cout<<*it<<" ";visited[*it] = true; }}} }void DFS_iter(){vector<bool> visited(n,false);for(int i = 0; i < n; i++){if(!visited[i]){DFSUtils_iter(i,visited);cout<<";"; //每个连通分量用";"分隔 }} }
};
int main()
{ Graph g(5); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); g.addEdge(4, 3);g.addEdge(4, 2);cout<<"图的深度优先"<<endl;g.DFS(); cout <<"\n图的广度优先:"<<endl; g.BFS(); cout<<"\n图的深度优先(非递归)"<<endl;g.DFS_iter();return 0;
}
结果:
//每个连通分量用";"分隔
1、有向图:
2、无向图:addEdge
要改成这样
void addEdge(int v, int w){adj[v].push_back(w); //默认为有向图 adj[w].push_back(v); //无向图的话 }
图(用list邻接表表示)的深度优先和广度优先(递归和非递归实现)相关推荐
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
- 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历
简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...
- 算法6.6 采用邻接表表示图的深度优先搜索遍历
算法6.6 采用邻接表表示图的深度优先搜索遍历 代码实现 #pragma once #include <iostream>using namespace std;//图的邻接表存储表示 # ...
- 图2——利用邻接表创建有向图
图2--利用邻接表创建有向图 图 假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表. 主要考查对邻接表的理解.图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是 ...
- 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现
上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树 和 各种基本算法实现小结( ...
- 图的邻接表存储与深度优先遍历代码实现
Graph.h Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化) #include <std ...
- 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现
邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...
最新文章
- 云服务干掉的是运维。
- QC数据库恢复,解决SQL孤立用户问题
- MySQL——数据库的增删改操作
- 需求用例分析之三:补充规约
- Java Servlet监听器的分类
- owaspbwa tickets
- 《商业智能BI白皮书3.0》正式发布(附下载链接)
- python核心编程五——映像和集合
- 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)...
- 打开outlook2010里面的链接显示 “由于本机的限制,该操作已被取消。请与系统管理员联系。”解决方法...
- opencv基础---直方图均衡化(原理equalizeHist)
- python画曲线图-python怎么画曲线图
- python后台架构Django教程——项目配置setting
- 聊聊spring cloud gateway的SetStatusGatewayFilter
- java 异常java.lang.UnsupportedOperationException
- Autorun.inf病毒和qhbpriAppInit_DLLs专杀
- Mac M1 百度网盘客户端无法打开,网络连接不上
- MATLAB拟合圆函数
- 终于找到了IE6修复大全
- No code “EPSG:4326“ from authority “EPSG“
热门文章
- python下载-python
- python和java哪个好学-到底学python好还是学java比较好 哪个容易学习点
- 0基础学python有多难-对于几乎是零基础的人,直接学 Python 编程合适吗?
- python爬虫什么意思-Python爬虫可以做什么?
- 慢牛系列五:用百度语音识别添加自选股
- Error in mounted hook: “TypeError: Cannot read property ‘init‘ of undefined“
- 无限极分类php简单,创建无限极分类树型结构的简单方法
- 导入php项目_商业裂变,之项目技术实战(第九节:程序框架的安装)
- 开源网络监控管理系统:OpenNMS
- java 有趣注释_Java8 中有趣酷炫的小技巧