数据结构之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都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
随机推荐
- python2.7练习小例子(十八)
19):题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. #!/usr/bin/python # -*- ...
- Lambda表达式详解【转】
前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...
- 位运算 & 网络序字节序
一.初识位运算 位运算,见词明意,二进制运算,通常需要将运算数转换为二进制再进行处理,如果是在程序语言中则无需自己进行进制转换,基本的位操作符有如下几种:与(&).或(|).异或(^).取反( ...
- JavaScript函数constructor的作用,意义
前几天写了一片 如何用正确的姿势编写jQuery插件 有朋友拍砖,指正.再此谢谢! 讨论:指定函数的constructor作用到底是什么? 我们一般写jQuery插件的时候是这样的: //构造函数 f ...
- NetBeans集成SVN代码管理实例
最近给银行做一个小工具,要求用Java做一个C端带界面的小工具,想来想去用NetBeans最合适,因为Eclipse,MyEclipse,IDEA这些做界面得要额外的UI插件,比较麻烦. 我跟同事两个 ...
- CentOS Linux release 7.5.1804下安装MySQL5.7.24
1.环境查看: 2.卸载自带MariaDB数据库: 3.下载MySQL5.7.14安装包: 4.使用wget工具下载需要安装数据库的依赖包: 5.解压缩bundel包: 6.按照顺序进行安装: 7.数 ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- (原)自定义资源预览工具:DZAssetPreviewPlugin(1)
@author: 白袍小道 转载请说明,谢谢 题记 后续工具制作单独作为一本(小道用的是OneNote,这样发布简单点.*--*) 总计放到写完后. 目的 1.快速预览资源(因为大部分 ...
- PAT——乙级1036:跟奥巴马一起编程 &乙级1027:打印沙漏 (有坑)
乙级1036 1036 跟奥巴马一起编程 (15 point(s)) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算 ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...