【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) 我一贯习惯有 ...
随机推荐
- phpstudy 2016 切换Nginx+php7.0版本所需运行库 vc14 + 安装redis拓展
去微软官方下载vc14的运行库 链接:https://www.microsoft.com/en-us/download/details.aspx?id=48145 32位运行库 安装成功 切换版本成功 ...
- AUTOCAD参数约束功能
概要:http://through-the-interface.typepad.com/through_the_interface/2011/08/a-simplified-net-api-for-a ...
- sea.js 个人入门
玉伯 : http://seajs.org/docs/ 说这两个JS 必须提到AMD.commonjs两种不同的规范: 奇舞团:http://www.75team.com/archives/882 知 ...
- 初学python之路-day02
python,诞生于1989年的圣诞,Guido van Rossum为了打发无聊,因此发明了python,并且开放了其源代码,使得这门语言在随后的几十年的发展的越来越广.现今,2.x版本已经在2.7 ...
- 爬虫框架 Scrapy
一 介绍 crapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用 ...
- jquery 第一章
1.本章目标 了解jquery 了解jquery和js的区别 掌握jquery的入门 掌握jquery对象和dom对象的区别2.jquery简介 jquery是一个轻量级 ...
- Java+maven+httpcomponents封装post/get请求
httpcore4.4.10, httpclient4.5.6 package com.test.http; import com.alibaba.fastjson.JSONArray; import ...
- docker安装 <一>
一.docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制, ...
- linux 硬盘满了如何处理
事件源于在服务器运行一个脚本程序… 好好的脚本突然报错,还以为脚本出现问题了.细看报错原因(具体报错信息已经忘记了),是没有可用空间.从没遇见过这个情况,怎么办呢? 一.确定是不是真的是磁盘空间不足 ...
- Azure Database for MySQL 报 Please specify SSL options and retry.
Exception has been thrown by the aspect of an invocation. ---> Authentication to host 'xxx.mysql. ...