博客
关于我
C++邻接表存储图的深度优先搜索
阅读量:354 次
发布时间:2019-03-04

本文共 1815 字,大约阅读时间需要 6 分钟。

在数据结构中,图的存储方法主要分为邻接矩阵、邻接表和边集三种形式,其中邻接表和邻接矩阵较为常用。对于初学者来说,直接使用邻接表可能会比较复杂,涉及到多个结构体的嵌套,因此在学习过程中,通常会选择一个更简单的工具来辅助实现。

下面是具体的实现过程:

由于vector的灵活性,可以通过创建一个顶点数为N的邻接表数组Adj[N]来存储图的邻接信息。这样可以根据实际图的边数动态分配存储空间,每个顶点对应的邻接列表可以通过vector来实现。

如果只需要存储每条边的终点编号,可以直接将邻接表的元素类型设为int,如vector

。需要同时存储边的终点编号和边权时,可以定义一个结构体Node,用于存储每条边的终点和权重,代码如下:

struct Node {    int v;    int weight;};

这样,添加一条从顶点1到顶点3的有向边,边权为4,只需创建一个Node实例temp,设定temp.v = 3,temp.weight = 4,然后将temp加入Adj[1]即可,代码如下:

Node temp;temp.v = 3;temp.weight = 4;Adj[1].push_back(temp);

测试数据示例:

560 1 10 2 20 3 31 4 42 4 23 4 5

下面是使用vector实现邻接表存储有向有权图并进行深度优先搜索的完整代码:

#include 
#include
#include
using namespace std;struct Node { int v; int weight;};vector
> Adj;bool vis[MAX_SIZE] = {false};void dfs(int u) { vis[u] = true; cout << u << " "; for (int i = 0; i < Adj[u].size(); i++) { Node node = Adj[u][i]; int v = node.v; if (!vis[v]) { dfs(v); } }}int n, edges;int main() { cout << "输入图中的顶点数: "; cin >> n; cout << endl; cout << "输入图中的边数: "; cin >> edges; cout << endl; cout << "输入图中的边信息(起始顶点, 结束顶点, 边权重):" << endl; for (int i = 0; i < edges; i++) { cin >> u >> v >> weight; Node newNode; newNode.v = v; newNode.weight = weight; Adj[u].push_back(newNode); } // 输出邻接表结构 for (int i = 0; i < n; i++) { if (!Adj[i].empty()) { cout << i << " "; for (int j = 0; j < Adj[i].size(); j++) { Node pop = Adj[i][j]; cout << pop.v << " "; } cout << endl; } } cout << "深度优先搜索顶点的结果如下: " << endl; dfs(0); return 0;}

以上代码实现了一个邻接表存储的有向有权图,并通过深度优先搜索算法遍历图中的顶点。通过输入图的顶点数和边数,以及每条边的起始顶点、结束顶点和权重,可以完成对图的构建和遍历。

转载地址:http://gewg.baihongyu.com/

你可能感兴趣的文章
Python中的filter()函数!!!1
查看>>
LeetCode:1640. 能否连接形成数组!!!
查看>>
(新手小白必学!)用Python设计和实现聪明的尼姆游戏(人机对战)!!!!
查看>>
LeetCode:283. 移动零!!!1
查看>>
Python实验26:计算文件MD5值
查看>>
端口探测
查看>>
LeetCode:28. 实现 strStr()——————简单
查看>>
java 中 private default protected public 范围
查看>>
LeetCode:697. 数组的度————简单
查看>>
LeetCode:1052. 爱生气的书店老板————中等
查看>>
C语言的6大基本数据类型!(学习C语言小白必备!!)
查看>>
成为一个优秀数据工程师学习内容(1)
查看>>
红黑树学习
查看>>
Redis未授权访问漏洞
查看>>
SpringBoot整合Redis
查看>>
3D案例——旋转木马
查看>>
vue中导入导入 Mint-UI的注意事项
查看>>
Vue——mock模拟数据的使用
查看>>
Nginx配置反向代理与负载均衡
查看>>
socket多线程实现tcp server
查看>>