深度搜索(DFS) and  广度搜索(BFS)

代码如下:

 #include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
#define MAX 30
#define MVNum 100
#define ERROR 1
typedef char VerTexType;
typedef int Status;
typedef int QElemType;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct ArcNode //边结点
{
int adjvex; //改变所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
string info; //和边相关的信息
}ArcNode;
typedef struct VNode //顶点信息
{
VerTexType data;
struct ArcNode *link; //指向第一条依附该顶点的边的指针
}VNode; //AdList表示邻接表类型
typedef struct //邻接表
{
VNode xlist[MAX];
int vexnum, arcnum; //图的当前顶点数和边数
}ALGraph; typedef struct Node //构造队列
{
int data;
struct Node *next;
}Node,*QNode;
typedef struct
{
QNode front; //队头指针
QNode rear; //对尾指针
}Queue;
Status InitQueue(Queue &Q) //初始化队列
{
Q.front = Q.rear=new Node; //生成新节点作为头节点,对头和队尾指针指向此节点
if (!Q.front)
exit(OVERFLOW);
Q.front->next = NULL; //头结点的指针域置空
return OK;
} Status EnQueue(Queue &Q, int e) //入队操作
{
QNode p = new Node;
if (!p) //存储分配失败
exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p; //把当前的p设置尾对尾节点,rear指向p
return OK;
} Status DeQueue(Queue &Q, int &e) //出队操作
{
QNode p;
p = Q.front->next; //将欲删除的对头结点暂存给p
Q.front->next = p->next; //将原队头节点后继p->next赋值给头结点后继
if (Q.rear == p) //如果队头是队尾,则删除后将rear指向头节点
Q.rear = Q.front;
e = p->data; //将欲删除的对接点赋值给e
delete p;
return OK;
} Status QueueEmpty(Queue Q) //队列判空
{
if (Q.rear == Q.front)
return ;
else
return ;
} int LocateVex(ALGraph &G, char &v) //定位函数
{
int i;
for (i = ; i < G.vexnum; i++)
{
if (G.xlist[i].data == v)
return i;
}
if (i >= G.vexnum)
return ERROR;
else
return ;
}
void CreateUDG(ALGraph &G) //创建无向图
{
ArcNode *p1, *p2;
int i, j, k;
char v1, v2;
cout << "请输入图的顶点数、边数:" << endl;
cin >> G.vexnum >> G.arcnum; //输入总顶点数,总边数
cout << "请输入顶点的值:(顶点之间用空格分离)" << endl;
for (i = ; i < G.vexnum; i++)
{
cin >> G.xlist[i].data; //输入顶点值
G.xlist[i].link = NULL; //初始化表头结点的指针域为NULL
}
cout << "请输入弧尾和弧头:" << endl;
for (k = ; k < G.arcnum; k++)
{
cin >> v1 >> v2; //输入各边,构造邻接表
i = LocateVex(G, v1);
j = LocateVex(G, v2);
p1 = new ArcNode; //生成一个新结点*p1
p1->adjvex = j; //邻接点序号为j
p1->nextarc = G.xlist[i].link;
G.xlist[i].link = p1;
p2 = new ArcNode;
p2->adjvex = i;
p2->nextarc = G.xlist[j].link;
G.xlist[j].link = p2;
}
cout << "图构建成功!" << endl<<endl;
} static bool visited[MAX]; //访问过visited,为1否则为0 void DFS(ALGraph G, int m) //深度优先搜索
{
visited[m] = true; //标记已经遍历过
cout << G.xlist[m].data<<" ";
ArcNode *p = G.xlist[m].link;
while (p)
{
if (!visited[p->adjvex])
DFS(G, p->adjvex);
p = p->nextarc;
}
} void BFS(ALGraph G,int n) //广度优先搜索
{
ArcNode *p;
Queue Q;
for (int i = ; i < G.vexnum; i++)
visited[i] = false;
InitQueue(Q);
for (int i = ; i < G.vexnum; i++)
{
if (!visited[i])
{
visited[i] = true;
cout << G.xlist[i].data<<" ";
EnQueue(Q, i);
while (!QueueEmpty(Q))
{
DeQueue(Q, i);
p = G.xlist[i].link; //找到当前顶点编表链表头指针
while (p)
{
if (!visited[p->adjvex])//若此顶点未访问
{
visited[p->adjvex] = true;
cout << G.xlist[p->adjvex].data<<" ";
EnQueue(Q, p->adjvex);//将此顶点入队列
}
p = p->nextarc; //指针指向下一个邻接点
}
}
}
}
} void coutGraphD(ALGraph G) //深搜输出函数
{
for (int i = ; i < G.vexnum; i++)
visited[i] = false;
cout << "深度优先搜索输出的顶点的结果为:" << endl;
for (int i = ; i < G.vexnum; i++)
if (!visited[i])
DFS(G, i);
cout << endl;
}
void coutGraphW(ALGraph G) //广搜输出函数
{
for (int i = ; i < G.vexnum; i++)
visited[i] = false;
cout << "广度优先搜索输出的顶点的结果为:" << endl;
for (int i = ; i < G.vexnum; i++)
if (!visited[i])
BFS(G, i);
cout << endl; }
int main()
{
ALGraph MG;
CreateUDG(MG);
coutGraphD(MG);
coutGraphW(MG);
return ;
}

运行结果:

数据结构之DFS与BFS的更多相关文章

  1. 数据结构之DFS与BFS实现

    本文主要包括以下内容 邻接矩阵实现无向图的BFS与DFS 邻接表实现无向图的BFS与DFS 理论介绍 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似 ...

  2. 【数据结构与算法笔记04】对图搜索策略的一些思考(包括DFS和BFS)

    图搜索策略 这里的"图搜索策略"应该怎么理解呢? 首先,是"图搜索",所谓图无非就是由节点和边组成的,那么图搜索也就是将这个图中所有的节点和边都访问一遍. 其次 ...

  3. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  4. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  5. 数据结构基础(21) --DFS与BFS

    DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...

  6. 《数据结构》C++代码 BFS与DFS

    BFS,广度优先搜索,一层一层去遍历图,故称广度优先.实现方式:队列. DFS,深度优先搜索,撞墙才回头的遍历,称为深度优先.实现方式:递归(栈). 这两种遍历方式,是访问图的基本方式.如果拿树做对比 ...

  7. 列出连通集(DFS及BFS遍历图) -- 数据结构

    题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...

  8. Java数据结构——图的DFS和BFS

    1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...

  9. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

随机推荐

  1. P1855 榨取kkksc03

    P1855 榨取kkksc03 题目描述 以下皆为真实的故事. 洛谷2的团队功能是其他任何oj和工具难以达到的.借助洛谷强大的服务器资源,任何学校都可以在洛谷上零成本的搭建oj并高效率的完成训练计划. ...

  2. JS控制文本框输入的内容

    总而言之:   先在‘<input>’ 里输入      onkeyup="value=value.replace(/[^\X]/g,'')" 然后在(/[\X]/g, ...

  3. MySQL训练营01

    一.数据库基础知识: 1. 数据库(database):保存有组织的数据的容器(通常是一个或者一组文件) 2. 数据库管理系统(DBMS):数据库软件,外界通过DBMS来创建和操纵数据库,具体是什么, ...

  4. c# 把List<T>转成DataTable对象,批量导入Sqlserver库

    /// <summary> /// Sqlbulkcopies the specified SMS.批量插入到数据库 /// </summary> /// <param ...

  5. [译]10个有关SCP的命令

    原文来源: https://www.tecmint.com/scp-commands-examples/ 基本语法 scp source_file_name username@destination_ ...

  6. 前端JQuery中获取一个div下的多个id值

    获取所有的Id值,方法是通过div.class获取全局的值,然后再提取具体的Id值 方法一:用for循环,因为$("div.class")获取的是一个数组,通过循环读取出数组中的每 ...

  7. 软工实践 - 第二十七次作业 Beta 冲刺(5/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10134471.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  8. 【积累】LinqToSql复合查询结果转DataTable数据

    最近的项目用到了大量的复合查询结果用于数据源,绑定到数据控件上. 为了方便,我们把它转换成DataTable的数据源形式.请看下面的示例: 1)思考自己需要的数据,然后组合,因此创建一个新的类: // ...

  9. 201621044079 week05-继承、多态、抽象类与接口

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 interface关键字 implements has-a;comparable co ...

  10. 【工作感悟】——揭开“PM”的面纱

    [前言] 上次跟大家分享了面试的故事,小编觉得效果还不错,因此小编决定把工作感悟系列写下去,不过时间就不好说了.希望小伙伴们在评论列表中发表自己的看法和观点,积极参与啦~~ [背景] 初来Y公司,作为 ...