图是应用最为广泛的数据结构之一,图的搜索算法可以使我们发现图的很多结构信息。本文采用邻接表表示表,实现了图的深度和广度优先搜索算法(部分代码从网上参阅得来)。
第一步: 图的邻接表表示:
#include <iostream>
#include <stdlib.h>
#include <queue>
using namespace std;
// 邻接表表示
#define MAX_VERTEX_NUM 20 //最大顶点数
#define MAX_EDGE_NUM 40 //最大边数
int visited[MAX_VERTEX_NUM];
typedef int VertexType; //顶点数据类型
typedef struct ArcNode
{
int advex; //邻接点域
int weight; //权值
struct ArcNode *nextarc; //连接结点
}ArcNode;
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
}Vode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum, arcnum;
int kind;
}ALGraph;
void CreateDG(ALGraph &G)
{
int i, j, k;
ArcNode *p;
cout << "创建一个图: " << endl;
cout << "顶点数: ";
cin >> G.vexnum;
cout << endl;
cout << "边数: ";
cin >> G.arcnum;
cout << endl;
for (i = 0; i < G.vexnum; ++i)
{
G.vertices[i].data = i;
G.vertices[i].firstarc = NULL;
}
for (k = 0; k < G.arcnum; ++k)
{
cout << "请输入第"<< k + 1 << "条边:";
cin >> i >> j;
p = new ArcNode();
p->advex = j;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
}
}
void Disp(ALGraph G)
{
int i, j;
ArcNode *p;
cout << "输出图为:" << endl;
for (i = 0; i < G.vexnum; ++i)
{
p = G.vertices[i].firstarc;
j = 0;
while(p != NULL)
{
cout << "(" << i << "," << p->advex << ")";
p = p->nextarc;
j = 1;
}
if (j == 1)
cout << endl;
}
}
第二部分广度优先搜索和深度优先搜索
// 广度优先遍历图
void bfs(ALGraph G, int v)
{
queue<VNode> q;
q.push(G.vertices[v]);
visited[v] = 1;
VNode vNode;
cout << v << " ";
while (!q.empty())
{
vNode = q.front();
q.pop();
ArcNode *p = vNode.firstarc;
while(p != NULL)
{
if (visited[p->advex] == 0)
{
cout << p->advex << " ";
vNode.data = p->advex;
vNode.firstarc = G.vertices[vNode.data].firstarc;
q.push(vNode);
visited[p->advex] = 1;
p = p->nextarc;
}
}
}
}
// 深度优先遍历图
void dfs(ALGraph G, int v)
{
ArcNode *p;
cout << v << " ";
visited[v] = 1;
p = G.vertices[v].firstarc;
while (p != NULL)
{
if (! visited[p->advex])
dfs(G, p->advex);
p = p->nextarc;
}
return;
}
void dfs1(ALGraph G)
{
int i;
for (i = 0; i < G.vexnum; ++i)
if (visited[i] == 0)
dfs(G, i);
}
最后一步,代码测试:
void main()
{
ALGraph G;
CreateDG(G);
int v;
Disp(G);
cout << "输入源顶点: ";
cin >> v;
cout << "选择遍历方式: " << endl;
cout << "1 深度优先搜索 \t2 广度优先搜索" << endl;
int flag;
cin >> flag;
if (flag == 1)
dfs1(G);
if (flag == 2)
bfs(G, v);
cout << endl;
}
就大功告成了。
分享到:
相关推荐
深度优先搜索算法和广度优先搜索算法都是常用的图遍历算法,它们都可以用于解决图的遍历问题。但是,这两种算法有着不同的实现机制和应用场景。深度优先搜索算法更适合用于解决图的深度遍历问题,而广度优先搜索算法...
通过算法实现图的深度优先遍历和广度优先遍历
"图的深度优先遍历和广度优先遍历算法" 图的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握图这一数据结构的基础。通过此程序算法可以进一步掌握图的构造以及遍历的相关知识。 图的深度优先遍历算法 ...
数据结构课程中的深度优先搜索算法、广度优先搜索算法的C语言程序,在Turbo C 2.0上调试通过。
本文将详细介绍图的深度和广度优先搜索算法的实现,包括邻接矩阵和邻接表的定义、深度优先搜索和广度优先搜索的算法实现、源代码实现等。 图的邻接矩阵和邻接表 在图论中,图可以用邻接矩阵或邻接表来表示。邻接...
图的深度优先搜索(DFS, Depth-First Search)和广度优先搜索(BFS, Breadth-First Search)是图论中的两种基本遍历算法,它们在计算机科学中有着广泛的应用,例如在解决网络爬虫、迷宫求解、社交网络分析等问题时。...
哈尔滨工业大学计算机科学与技术试验之图的深度与广度优先算法
图的深度优先搜索(DFS, Depth First Search)和广度优先搜索(BFS, Breadth First Search)是图论中的两种基本搜索算法,用于遍历或搜索树或图。这两种算法在解决各种问题时有着广泛的应用,如寻找最短路径、判断...
深度优先搜索和广度优先搜索在许多问题中都有应用,例如检测图中的环、找到最短路径、查找连通组件等。在Java中,这两种算法的实现都需要考虑效率和空间复杂性,以适应不同的问题需求。通过理解这些概念并熟练使用...
这篇文章介绍了使用邻接表表示的图的深度优先搜索和广度优先搜索程序,旨在帮助读者理解图的深度优先搜索和广度优先搜索算法的实现。 首先,文章定义了图的邻接表表示的数据结构,包括顶点结点 vertexnode 和边结点...
图的遍历是图论中的基础操作,主要包含两种主要的算法:深度优先搜索(Depth-First Search,DFS)和广度优先搜索...在实际编程中,根据问题的具体需求,选择合适的遍历算法和图的存储结构,可以提高算法的效率。
本源文件CPP中代码使用深度优先和广度优先遍历图的算法。
数据结构课程中的深度优先搜索算法、广度优先搜索算法的C语言程序,在Turbo C 2.0上调试通过。
了解DFS和BFS的原理和实现至关重要,因为它们是许多高级算法和数据结构的基础,例如拓扑排序、最短路径计算(Dijkstra算法和Bellman-Ford算法)、强连通分量检测等。熟练掌握这两种搜索算法,对于提升编程能力和解决...
### 图的深度、广度优先遍历(C语言) #### 概述 本文将详细介绍如何在C语言中实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。...理解并掌握这两种算法对于学习高级算法和数据结构至关重要。
深度搜索(Depth First Search, DFS)和广度搜索(Breadth First Search, BFS)是图论和树形结构中常用的两种遍历算法,它们在计算机科学中有着广泛的应用,如解决路径查找、拓扑排序、最短路径等问题。本文将详细...
在“实验四图的深度优先搜索和广度优先搜索”中,你可以学习如何实现这两种搜索算法,并理解它们之间的差异。通过实践,你将能够熟练掌握这些核心算法,这对于解决复杂问题和优化程序性能至关重要。此外,实验提供的...
在这个主题中,我们将深入探讨如何使用类模板实现无向图的邻接矩阵表示法,以及如何通过深度优先搜索(DFS)和广度优先搜索(BFS)遍历这样的图。 首先,让我们理解邻接矩阵的概念。邻接矩阵是一个二维数组,其中的...
深度优先及广度优先算法c语言源码,深度优先及广度优先算法c语言源码