深度搜索(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. 【Leetcode】Jewels and Stones

    Jewels and Stones Description You're given strings J representing the types of stones that are jewel ...

  2. Angularjs 跨域post数据到springmvc

    先贴网上己有解决方案链接: http://www.tuicool.com/articles/umymmqY  (讲的是springmvc怎么做才可以跨域) http://my.oschina.net/ ...

  3. grunt in webstorm

    1.install grunt sudo npm install -g grunt-cli npm install grunt --save-dev

  4. Hadoop学习(四) FileSystem Shell命令详解

    FileSystem Shell中大多数命令都和unix命令相同,只是两者之间的解释不同,如果你对unix命令有基本的了解,那么对于FileSystem Shell的命令,你将会感到很亲切. appe ...

  5. 删除txt文件内容

    删除txt文件里的 聊天记录的时间那一行 f = open("d:\\面试.txt", "r") g = open("d:\\英雄联盟ADC技巧.tx ...

  6. springmvc基础篇—拆分配置文件

    一般来讲,在企业实际项目中通常会将配置文件设置为两个:spring-mvc.xml.beans.xml,各自管各自的内容,方便管理. 一.在src下增加如下配置文件: <?xml version ...

  7. 「题目代码」P1029~P1033(Java)

    1029 C基础-求解方程 import java.util.*; import java.io.*; import java.math.BigInteger; public class Main { ...

  8. PHP将两个数组相加

    $arr_a=[1=>1,2=>2,3=>3];$arr_b=[1=>'a',4=>4];print_r($arr_a+$arr_b);返回结果:Array ( [1] ...

  9. 并查集——hdu1213(入门)

    传送门:How Many Tables 模板代入 判断几个连通分支 DFS亦可完成 [并查集] #include <iostream> #include <cstdio> #i ...

  10. JS让网页上文字出现键盘打字的打字效果

    一个挺简单的网页特效:JS让网页上文字出现键盘打字的打字效果实现 演示地址:http://codepen.io/guihailiuli/pen/jPOYMZ 以代码形式实现过程分析: <html ...