【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) 我一贯习惯有 ...
随机推荐
- torch.utils.data.DataLoader对象中的迭代操作
关于迭代器等概念参考:https://www.cnblogs.com/zf-blog/p/10613533.html 关于pytorch中的DataLoader类参考:https://blog.csd ...
- Javascript模块化简史
Script标签和闭包 RequireJS, AngularJS以及依赖注入 Node.js以及CommonJS的出现 ES6, import, Babel和Webpack https://ponyf ...
- 002_soa_zk处理经验总结
一. 遇到这种情况直接把当前目录下的acceptedEpoch和currentEpoch挪走,重启publisher即可. cat /data/zookeeper/data/version-2/acc ...
- 51nod--1185 威佐夫游戏 V2 (博弈, 乘法模拟)
题目: 1185 威佐夫游戏 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中 ...
- 【原创】大叔经验分享(22)securecrt连接自动断开
securecrt一段时间没有操作连接就会自动断开(xshell就没有这个问题),提示信息为:信号灯超时时间已到,解决方法为: Options -- Session Options -- Termin ...
- 在CentOs7上部署Gunicorn
Gunicorn 的作用与优点这里就不再赘述,如不知道你也不会找这些对吧? 正文 安装简单,直接使用pip即可 pip3 install gunicorn 昨日在 Centos 中想部署Gunicor ...
- Java面试题复习笔记(框架)
1.什么是框架? 为解决一个开放性问题而设计的具有一定约束性的支撑结构,再次结构上可以根据具体问题扩展,安插更多的组成部分,从而更迅速和方便地构建完整解决问题的方案. 2.MVC模式? 用一种业务逻辑 ...
- Java_Number(装箱和拆箱)
所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number子类 装箱: 自动将基本数据类型装换为包装器类型 拆箱: 自动将包装器类型转换为基本数据类 ...
- 关于 win10 系统中 Anaconda3 中修改 Jupyter Notebook 默认启动目录
目标: 修改Anaconda3中自带的Jupyter Notebook默认启动目录. 步骤: 1.提前创建好你想要启动位置文件夹. 2.寻找配置文件,"jupyter_not ...
- tp框架设置404页面
无法加载模板跳向404页面 /thinkphp/library/think/Dispatcher.class.php中176行 // 加载模块的扩展配置文件 load_ ...