数据结构之DFS与BFS
深度搜索(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的更多相关文章
- 数据结构之DFS与BFS实现
本文主要包括以下内容 邻接矩阵实现无向图的BFS与DFS 邻接表实现无向图的BFS与DFS 理论介绍 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似 ...
- 【数据结构与算法笔记04】对图搜索策略的一些思考(包括DFS和BFS)
图搜索策略 这里的"图搜索策略"应该怎么理解呢? 首先,是"图搜索",所谓图无非就是由节点和边组成的,那么图搜索也就是将这个图中所有的节点和边都访问一遍. 其次 ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- 数据结构基础(21) --DFS与BFS
DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...
- 《数据结构》C++代码 BFS与DFS
BFS,广度优先搜索,一层一层去遍历图,故称广度优先.实现方式:队列. DFS,深度优先搜索,撞墙才回头的遍历,称为深度优先.实现方式:递归(栈). 这两种遍历方式,是访问图的基本方式.如果拿树做对比 ...
- 列出连通集(DFS及BFS遍历图) -- 数据结构
题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...
- Java数据结构——图的DFS和BFS
1.图的DFS: 即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访 ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
随机推荐
- Windows Server 2012下手动配置IIS的文件夹访问权限
当新建一个website的时候,一般情况下IIS对相应的物理文件夹的访问权限是不够的. 针对匿名认证(anonymous authentication)需要: 打开文件夹properties-> ...
- JENKINS系统的安装部署
JENKINS 安装使用文档 简介 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成,集成Jenkins可 ...
- 批处理bat实现创建、复制、删除文件及文件夹
转自:http://blog.csdn.net/linda1000/article/details/10221285 1 建bat文件自动执行复制,删除命令. 例1:以下是复制cd.dll文件至win ...
- 如何搭建SBT编译Scala开发的Android工程
作者:戚明峰 最近接触了shadowsocks的Android客户端项目源码(https://github.com/shadowsocks/shadowsocks-android),刚好这个项目是使用 ...
- 通过圆形按钮的绘制熟悉Qt的绘图机制,掌握这种终极方法
基本上用QPainter就可以实现 1. QPainter painter(this); //开始的标志(可以不用) painter.begin(this); //保存最初的设置 painter.sa ...
- Linux-Shell脚本编程-学习-2-Linux基本命令
接上篇,接着学习Linux下的部分命令,后面的这些命令用到的频率可能没有那么多,不过也是经常需要的. 第一部分:程序监测部分,ps和top top命令可能比较眼熟,所以我们先说ps ps命令最烦人了, ...
- JAVA虚拟机(一):内存区域
根据<java虚拟机规范第二版>规定,现阶段的java内存区域总体如下图 其中,方法区和堆是所有线程共享区域. 虚拟机栈,本地方法栈,程序计数器是各线程独占. 概述一下各个区域 先说说线程 ...
- spring boot接口 支持https
1.拥有证书,可自己生成测试用javatool生成 keytool -keystore [keyname].jks -genkey -alias tomcat -keyalg RSA 接下来输入相关信 ...
- [转载]压力测试工具siege的用法
压力测试工具siege 原文:http://blog.csdn.net/qingye2008/article/details/34500949 Siege是Linux下的一个web系统的压力测试工具, ...
- GraphSAGE 代码解析(三) - aggregators.py
原创文章-转载请注明出处哦.其他部分内容参见以下链接- GraphSAGE 代码解析(一) - unsupervised_train.py GraphSAGE 代码解析(二) - layers.py ...