声明:图片及内容基于https://www.bilibili.com/video/BV1rp4y1Q72r?from=articleDetail

图的遍历

深度优先遍历(DFS)

DFS核心是递归和栈

原理

邻接矩阵DFS代码

template <class T>
void MGraph<T>::DFS(int i){
cout<<vertex[i]<<" ";
visit[i]=1;
for(int j=0;j<vertexNum;j++){ //对邻接矩阵的第i行的每一列遍历
if(visit[j]==0&&arc[i][j]!=0&&arc[i][j]!=INFINIT){
DFS(j);
}
}
}
template <class T>
void MGraph<T>::DFSTraverse(){
for(int i=0;i<vertexNum;i++){ //visit数组初始化
visit[i]=0;
}
for(int i=0;i<vertexNum;i++){
if(!visit[i])
DFS(i);
}
}

完整代码

#include<iostream>
#define MAXVAX 100
using namespace std;
const int INFINIT=65535;
int visit[MAXVAX];
template <class T>
class MGraph {
private:
T *vertex; //顶点信息
int **arc; //邻接矩阵
int vertexNum,arcNum; //顶点数,边数
public:
MGraph(T v[],int n,int e);
~MGraph();
void DFS(int i);
void DFSTraverse();
void display();
};
template <class T>
void MGraph<T>::DFS(int i){
cout<<vertex[i]<<" ";
visit[i]=1;
for(int j=0;j<vertexNum;j++){
if(visit[j]==0&&arc[i][j]!=0&&arc[i][j]!=INFINIT){
DFS(j);
}
}
} template <class T>
void MGraph<T>::DFSTraverse(){
for(int i=0;i<vertexNum;i++){
visit[i]=0;
}
for(int i=0;i<vertexNum;i++){
if(!visit[i])
DFS(i);
}
}
template <class T>
MGraph<T>::MGraph(T v[],int n,int e) { //n是顶点数,e是边数
vertexNum=n;
arcNum=e;
vertex = new T[vertexNum]; //建立顶点信息
arc = new int*[vertexNum]; //建立邻接表
for(int i=0; i<vertexNum; i++)
arc[i]=new int[vertexNum]; for(int i=0; i<vertexNum; i++) { //初始化顶点信息
vertex[i]=v[i];
}
for(int i=0;i<vertexNum;i++) //初始化邻接表
for(int j=0;j<vertexNum;j++){
if(i==j) arc[i][j]=0;
else arc[i][j]=INFINIT;
} int vi,vj,w;
for(int i=0;i<arcNum;i++){
cout<<"请输入边的两个顶点和这条边的权值"<<endl;
cin>>vi>>vj>>w; //输入边依附的两个顶点的编号 和权值
arc[vi][vj]=w; //有边标志
}
} template <class T>
void MGraph<T>::display(){
for(int i=0;i<vertexNum;i++){
for(int j=0;j<vertexNum;j++){
cout<<arc[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl; for(int i=0;i<vertexNum;i++){
cout<<vertex[i]<<" ";
}
cout<<endl;
} template <class T>
MGraph<T>::~MGraph(){
delete []vertex;
for(int i=0;i<vertexNum;i++)
delete [] arc[i];
delete [] arc;
}
int main(){
const char* v[5]={"v0","v1","v2","v3","v4"};
MGraph<const char*> mgraph(v,5,6);
mgraph.display();
mgraph.DFSTraverse();
return 0;
}

邻接表DFS代码

void ALGraph::DFS(int v){

    visited[v]=1;
cout<<adjList[v].vertex<<" ";
ArcNode *p=adjList[v].firstEdge;
while(p){
if(!visited[p->adjvex])
DFS(p->adjvex);
p=p->next;
}
}
void ALGraph::DFSTraverse(){
int i;
for(i=0;i<vertexNum;i++){
visited[i]=0;
}
for(i=0;i<vertexNum;i++){
if(!visited[i]){
DFS(i);
}
}
}

完整代码

#include<iostream>
#include<string.h>
using namespace std;
const int MAX=10;
int visited[4]={0,0,0,0};
typedef struct ArcNode{ //边结点
int adjvex;
ArcNode *next;
}ArcNode;
typedef struct { //表头
int vertex;
ArcNode *firstEdge;
}VertexNode[MAX];
class ALGraph{
private:
int vertexNum;
int arcNum;
VertexNode adjList;
public:
ALGraph(int v[],int n,int e);
void display();
void DFS(int v);
void DFSTraverse();
};
void ALGraph::DFSTraverse(){
int i;
for(i=0;i<vertexNum;i++){
visited[i]=0;
}
for(i=0;i<vertexNum;i++){
if(!visited[i]){
DFS(i);
}
}
}
void ALGraph::DFS(int v){ visited[v]=1;
cout<<adjList[v].vertex<<" ";
ArcNode *p=adjList[v].firstEdge;
while(p){
if(!visited[p->adjvex])
DFS(p->adjvex);
p=p->next;
}
}
ALGraph::ALGraph(int v[],int n,int e){
vertexNum=n;
arcNum=e;
for(int i=0;i<vertexNum;i++){
adjList[i].vertex=v[i];
adjList[i].firstEdge=NULL;
}
int vi,vj;
ArcNode *s;
for(int i=0;i<arcNum;i++){
cout<<"请输入第"<<i+1<<"条边的两个顶点在数组中的坐标"<<endl;
cin>>vi>>vj;
s=new ArcNode;
s->adjvex=vj;
s->next=adjList[vi].firstEdge;
adjList[vi].firstEdge=s;
s=new ArcNode;
s->adjvex=vi;
s->next=adjList[vj].firstEdge;
adjList[vj].firstEdge=s;
}
}
void ALGraph::display(){
for(int i=0;i<vertexNum;i++){
ArcNode *p=adjList[i].firstEdge;
cout<<adjList[i].vertex;
if(p) cout<<"->";
while(p){
cout<<p->adjvex<<" ";
p=p->next;
if(p) cout<<"->";
}
cout<<endl;
}
}
int main(){
int v[4]={0,1,2,3};
ALGraph algraph(v,4,4);
algraph.display();
algraph.DFSTraverse();
return 0;
}

广度优先遍历(BFS)

BFS核心是队列

原理

邻接矩阵BFS代码

template <class T>
void MGraph<T>::BFS(int i) {
queue<int> q;
visit[i]=1;
q.push(i);
while(!q.empty()) {
int t=q.front();
cout<<vertex[t]<<" ";
q.pop();
for(int j=0; j<vertexNum; j++) {
if(!vertex[i]&&arc[i][j]!=0&&arc[i][j]!=INFINIT) {
visit[j]=1;
q.push(j);
}
}
}
}
template <class T>
void MGraph<T>::BFSTraverse() {
for(int i=0; i<vertexNum; i++) { //visit数组初始化
visit[i]=0;
}
for(int i=0; i<vertexNum; i++) { //BFS
if(!visit[i])
BFS(i);
}
}

完整代码

#include<iostream>
#include<queue>
#define MAXVAX 100
using namespace std;
const int INFINIT=65535;
int visit[MAXVAX];
template <class T>
class MGraph {
private:
T *vertex; //顶点信息
int **arc; //邻接矩阵
int vertexNum,arcNum; //顶点数,边数
public:
MGraph(T v[],int n,int e);
~MGraph();void display();
void BFS(int i);
void BFSTraverse();
}; template <class T>
void MGraph<T>::BFS(int i) {
queue<int> q;
visit[i]=1;
q.push(i);
while(!q.empty()) {
int t=q.front();
cout<<vertex[t]<<" ";
q.pop();
for(int j=0; j<vertexNum; j++) {
if(!vertex[i]&&arc[i][j]!=0&&arc[i][j]!=INFINIT) {
visit[j]=1;
q.push(j);
}
}
}
} template <class T>
void MGraph<T>::BFSTraverse() {
for(int i=0; i<vertexNum; i++) { //visit数组初始化
visit[i]=0;
}
for(int i=0; i<vertexNum; i++) {
if(!visit[i])
BFS(i);
}
}

template <class T>
MGraph<T>::MGraph(T v[],int n,int e) { //n是顶点数,e是边数
vertexNum=n;
arcNum=e;
vertex = new T[vertexNum]; //建立顶点信息
arc = new int*[vertexNum]; //建立邻接表
for(int i=0; i<vertexNum; i++)
arc[i]=new int[vertexNum]; for(int i=0; i<vertexNum; i++) { //初始化顶点信息
vertex[i]=v[i];
}
for(int i=0; i<vertexNum; i++) //初始化邻接表
for(int j=0; j<vertexNum; j++) {
if(i==j) arc[i][j]=0;
else arc[i][j]=INFINIT;
} int vi,vj,w;
for(int i=0; i<arcNum; i++) {
cout<<"请输入边的两个顶点和这条边的权值"<<endl;
cin>>vi>>vj>>w; //输入边依附的两个顶点的编号 和权值
arc[vi][vj]=w; //有边标志
}
} template <class T>
void MGraph<T>::display() {
for(int i=0; i<vertexNum; i++) {
for(int j=0; j<vertexNum; j++) {
cout<<arc[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl; for(int i=0; i<vertexNum; i++) {
cout<<vertex[i]<<" ";
}
cout<<endl;
} template <class T>
MGraph<T>::~MGraph() {
delete []vertex;
for(int i=0; i<vertexNum; i++)
delete [] arc[i];
delete [] arc;
}
int main() {
const char* v[5]= {"v0","v1","v2","v3","v4"};
MGraph<const char*> mgraph(v,5,6);
mgraph.display();
mgraph.BFSTraverse();
return 0;
}

邻接表BFS代码

void ALGraph::BFS(int i){
queue<int> q;
visited[i]=1;
q.push(i); while(!q.empty()){
int t=q.front();
cout<<adjList[t].vertex<<" ";
q.pop();
ArcNode *p=adjList[i].firstEdge;
while(p){
if(!visited[p->adjvex]){
q.push(p->adjvex);
visited[p->adjvex]=1;
}
p=p->next;
}
}
}
void ALGraph::BFSTraverse(){
int i;
for(i=0;i<vertexNum;i++){
visited[i]=0;
}
for(i=0;i<vertexNum;i++){
if(!visited[i]){
BFS(i);
}
}
}

完整代码

#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
const int MAX=10;
int visited[4]={0,0,0,0};
typedef struct ArcNode{ //边结点
int adjvex;
ArcNode *next;
}ArcNode;
typedef struct { //表头
int vertex;
ArcNode *firstEdge;
}VertexNode[MAX];
class ALGraph{
private:
int vertexNum;
int arcNum;
VertexNode adjList;
public:
ALGraph(int v[],int n,int e);
void display();void BFS(int v);
void BFSTraverse();
};
void ALGraph::BFS(int i){
queue<int> q;
visited[i]=1;
q.push(i); while(!q.empty()){
int t=q.front();
cout<<adjList[t].vertex<<" ";
q.pop();
ArcNode *p=adjList[i].firstEdge;
while(p){
if(!visited[p->adjvex]){
q.push(p->adjvex);
visited[p->adjvex]=1;
}
p=p->next;
}
}
}
void ALGraph::BFSTraverse(){
int i;
for(i=0;i<vertexNum;i++){
visited[i]=0;
}
for(i=0;i<vertexNum;i++){
if(!visited[i]){
BFS(i);
}
}
} ALGraph::ALGraph(int v[],int n,int e){
vertexNum=n;
arcNum=e;
for(int i=0;i<vertexNum;i++){
adjList[i].vertex=v[i];
adjList[i].firstEdge=NULL;
}
int vi,vj;
ArcNode *s;
for(int i=0;i<arcNum;i++){
cout<<"请输入第"<<i+1<<"条边的两个顶点在数组中的坐标"<<endl;
cin>>vi>>vj;
s=new ArcNode;
s->adjvex=vj;
s->next=adjList[vi].firstEdge;
adjList[vi].firstEdge=s;
s=new ArcNode;
s->adjvex=vi;
s->next=adjList[vj].firstEdge;
adjList[vj].firstEdge=s;
}
}
void ALGraph::display(){
for(int i=0;i<vertexNum;i++){
ArcNode *p=adjList[i].firstEdge;
cout<<adjList[i].vertex;
if(p) cout<<"->";
while(p){
cout<<p->adjvex<<" ";
p=p->next;
if(p) cout<<"->";
}
cout<<endl;
}
}
int main(){
int v[4]={0,1,2,3};
ALGraph algraph(v,4,4);
algraph.display();
algraph.BFSTraverse();
return 0;
}

图的遍历(DFS和BFS)的更多相关文章

  1. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

  2. 图的遍历(DFS、BFS)

    理论: 深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广: 广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程: ...

  3. 图的遍历DFS

    图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...

  4. 图的遍历[DFS][BFS]

    #include<iostream> #include<iostream> #include<cstring> #include<queue> #inc ...

  5. 图的遍历——DFS

    原创 图的遍历有DFS和BFS两种,现选用DFS遍历图. 存储图用邻接矩阵,图有v个顶点,e条边,邻接矩阵就是一个VxV的矩阵: 若顶点1和顶点5之间有连线,则矩阵元素[1,5]置1,若是无向图[5, ...

  6. 图的遍历——DFS(矩形空间)

    首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...

  7. 图的遍历---DFS

    类型一:邻接表 题目一:员工的重要性 题目描述 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度 ...

  8. 图的遍历——DFS(邻接矩阵)

    递归 + 标记 一个连通图只要DFS一次,即可打印所有的点. #include <iostream> #include <cstdio> #include <cstdli ...

  9. 16.boost图深度优先遍历DFS

    #include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...

  10. 图的数据结构的实现与遍历(DFS,BFS)

    //图的存储结构:const int MAXSIZE = 10;//邻接矩阵template<class T>class MGraph {public:    MGraph(T a[], ...

随机推荐

  1. 一文讲透消息队列RocketMQ实现消费幂等

    这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等. 1 基础概念 消费幂等是指:当出现 RocketMQ 消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次 ...

  2. LeetCode227:基本计算器|| (栈、模拟)

    解题思路:两个双端队列模拟,一个存放操作数 a,另一个存放操作符 op,如果找到另一个操作数b,判断操作队列队尾是否是*/,是的话执行 a(*or/)b.遍历完字符串,如果操作符队列非空,说明还有+- ...

  3. Scrapy创建项目、爬虫文件

    创建项目 执行命令 scrapy startproject <项目名> 项目结构 创建爬虫文件 方式一:通过命令生成 scrpay genspider <爬虫名(必须唯一)> ...

  4. nginx-通过配置不同的虚拟主机实现,不同的uri访问不同资源

    先来一个配置 再来另外一个 这两个地址对应的域名都配置解析了,并且解析的ipv4地址是你的服务器ip,且上面配置文件中的内容都在服务器做了相应的配置,对应的路径下的资源是需要准备好的(比如网站或图片或 ...

  5. 云图说丨每个成功的业务系统离不开API网关(APIG)的保驾护航

    摘要:华为云API网关(APIG)是为企业开发者及合作伙伴提供的高性能.高可用.高安全的API托管服务, 帮助企业轻松构建.管理和部署不同规模的API. 本文分享自华为云社区<[云图说]第243 ...

  6. OpenMetric与时序数据库模型之主流TSDB分析

    摘要:为大家带来当下时序数据模型的主流TSDB分析及云厂商在时序数据模型方面的最新动态. 本文分享自华为云社区<[万字干货]OpenMetric与时序数据库存储模型分析(下)>,作者:敏捷 ...

  7. A/B测试有哪些常见应用场景?——火山引擎DataTester科普

      更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 火山引擎 DataTester不仅对外提供服务,也是字节跳动内部所应用的A/B实验平台,它基于先进的底层算法, ...

  8. 强强联合,ByteHouse 携手亚马逊云科技,新一代云数仓服务重磅升级

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着全球化的发展,越来越多的中国企业开始涉足海外市场,开展跨境业务.在这个过程中,强大的数据分析能力是出海企业不可 ...

  9. WPF 自定义可拖动标题栏

    要注意,拖拽的地方,需要加背景色,否则 DrageMove 将无效 MainWindows.xaml <Window x:Class="Report.MainWindow" ...

  10. OpenShift 与 OpenStack:让云变得更简单

    OpenShift 与 OpenStack 都是在 2010.2011 年左右创建的,用于构建可扩展云平台的开源技术,两者都用于在混合云环境中构建可扩展系统.从历史来看,OpenStack 的存在时间 ...