【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:https://www.cnblogs.com/acm-icpcer/p/10458956.html
算法思想使用的是殷人昆《数据结构(基于面向对象和C++)》第二版P364页的程序8.9&P366程序8.10
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
const long M=; struct node
{
int data;
struct node* next;
}; class Q
{
private:
node *head,*rear;
public:
Q()//this actually ruled that we do not use first node
{
head=new node();
rear=head;
}
void add(int a)
{
node *t=new node();
t->data=a;
rear->next=t;
rear=rear->next;
}
int remove()
{
node *t=head->next;
int result=t->data;
head->next=t->next;
delete t;
return result;
} node* gethead()
{
return head;
} bool isempty()
{
if(head->next==NULL)
return true;
else return false;
}
}; class G
{
private:
int map[M][M];
int visited[M];
int m;
public:
G()
{
cin>>m;
reset();
clean();
build();
} void reset()
{
memset(map,,sizeof(map));
cout<<"reset over!"<<endl;
} void clean()
{
memset(visited,,sizeof(visited));
cout<<"clean over!"<<endl;
} void build()
{
for(int i=;i<m;i++)
for(int j=;j<m;j++)
scanf("%d",&map[i][j]);
} void display()
{
cout<<"displaying:"<<endl;
for(int i=;i<m;i++)
{
for(int j=;j<m;j++)
cout<<map[i][j];
cout<<endl;
}
} int getfirstedge(int v)
{
if(v>m||v<) return -;
int i=;
while(map[v][i]<=&&i<m) i++;
if(i>m||i<) return -;
return i;
} int getnextedge(int v,int w)
{
int i=w+;
if(v>m||v<||i>m||i<) return -;
while(map[v][i]<=&&i<m) i++;
if(i>m||i<) return -;
return i;
}
/*
void dfs(int i,int j)
{
if(i>m||j>m||i<0||j<0||visited[i][j])
return; ++visited[i][j]; if(map[i][j]>0)
cout<<"node->"<<i<<":"<<map[i][j]; dfs(i-1,j);
dfs(i,j-1);
dfs(i+1,j);
dfs(i,j+1);
}
*/ void dfs(int v)//v represents a node
{
cout<<v;
visited[v]=;
int w=this->getfirstedge(v);
while(w>=&&w<m)
{
if(visited[w]!=)
dfs(w);
w=this->getnextedge(v,w);
}
} void bfs(int v)
{
Q *q=new Q();
cout<<v;
visited[v]=;
q->add(v);
while(!q->isempty())
{
int loc=q->remove();
int w=this->getfirstedge(loc);
while(w>=&&w<m)
{
if(visited[w]==false)
{
cout<<w;
visited[w]=;
q->add(w);
}
w=this->getnextedge(loc,w);
}
} } }; int main()
{
G *obj1=new G();
obj1->display();
/*
cout<<obj1->getfirstedge(1)<<endl;
cout<<obj1->getnextedge(1,obj1->getfirstedge(1))<<endl;
*/
obj1->clean();
cout<<"dfs:"<<endl;
obj1->dfs();
cout<<endl; obj1->clean();
cout<<"bfs:"<<endl;
obj1->bfs();
cout<<endl; return ;
}
代码运行说明:

tz@HZAU
2019/3/2
【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)的更多相关文章
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...
- 深度优先搜索DFS和广度优先搜索BFS
DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
随机推荐
- DeepLearning.ai学习笔记(五)序列模型 -- week1 循环序列模型
一.为什么选择序列模型 序列模型可以用于很多领域,如语音识别,撰写文章等等.总之很多优点... 二.数学符号 为了后面方便说明,先将会用到的数学符号进行介绍. 以下图为例,假如我们需要定位一句话中人名 ...
- Ubuntu18.04更换官方默认更新源sources.list
⒈备份官方默认更新源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak 备份官方更新源文件 ⒉编辑 1.打开 vi /etc/apt/sourc ...
- 再说C模块的编写(1)
[前言] 在<Lua“控制”C>中对Lua调用C函数做了初步的学习,而这篇才是重中之重,这篇文章会重点的总结C模块编写过程中遇到的一些问题,比如数组操作.字符串操作和C函数的状态保存等问题 ...
- MariaDB:开启日志记录SQL
1.开启日志 红色是命令,之下是回显. MariaDB [jksfrz]> SET GLOBAL log_output = 'TABLE'; Query OK, 0 rows affected ...
- FastDFS使用
1.在linux系统中安装FastDFS服务image-server.7z 2.导入FastDFS jar包 fastdfs_client_v1.20.jar 3.创建配置文件fastdfs_clie ...
- 小程序获取formid配置模板消息
小程序无限获取formid,发送模板信息 1.发送模板信息需要条件:formid 2.formid产生环境:提交form表单产生,并且只有真机才能出现————安卓一个13位的时间戳(近期使用得时候,安 ...
- angular 2+ 变化检测系列三(Zone.js在Angular中的应用)
在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...
- LINQ 详解
LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作 ...
- ionic2中使用极光IM的WebSDK实现即时聊天
本文主要介绍如何在ionic项目中集成极光IM的WebSDK,详细文档可参考官方介绍. 一.准备 1. 注册激光账号,进入开发者服务页面创建应用. 2. 创建应用后须完成对应平台的推送设置,进行应用或 ...
- 【C#】多数组间的取重取余
string[] arrRate = new string[] { "a", "b", "c", "d" };//A s ...