深度搜索(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. HBase配置和使用

    参考官方文档 整体实现框架 图1 以下几个为组成部件 21892 HMaster 22028 HRegionServer 21553 QuorumPeerMain 2366 NameNode 2539 ...

  2. HTC Vive小场地与大场景空间的解决方案

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52780621 作者:car ...

  3. 什么鬼,又不知道怎么命名class了

    什么鬼,又不知道怎么命名class了 2015/10/25 · CSS · class 分享到:5 原文出处: 结一(@结一w3cplus)    相信写css的人都会遇到下面的问题: 糟糕,怎么命名 ...

  4. jmeter无法启动的解决办法

    jmeter下载地址: 链接: https://pan.baidu.com/s/15YhiPH-kNVxISEZ4Mxf_WA     提取码: 25sv jdk 8.0 下载地址: 链接: http ...

  5. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  6. mingw编译opencv2.4.13问题记录

    为了在程序中用regex,升级了我的mingw,结果官网上的GCC版本都到6.3了,之前一直用4.8.换了编译器以后,对opencv2.4.10的引用就出了问题:undefined reference ...

  7. WIN8/8.1/10换系统常见的几个问题

    1.如果高级选项中没有UEFI固件设置,这该怎么进入BIOS呢? 答:还有一种方法是,首先关闭快速启动,然后重启,开机画面出来之后按F1,F2,F12,delete,总有一个是对的(不确定的话可以四个 ...

  8. html前端插件 ZenCoding 更名为Emmet

    eclipse下的使用方法   http://www.educity.cn/develop/651853.html visualstudio下的使用方式 http://www.johnpapa.net ...

  9. js调用本地office打开服务器的office文件预览

    本来是想做成直接在网页上在线预览office文件的,但是找了好多,要不是收费,要不就是要调用别人的API不安全,所以纠结了好久还是用调用本地的office预览office文件. 废话不多说,那么怎么调 ...

  10. Linux之JDK在线安装及配置

    1.查找java相关得列表  yum -y list java*2.在线安装 yum -y install java-1.6.0-openjdk*3.查看安装目录  ls -l /usr/lib/jv ...