数据结构——图的概念,图的存储结构,图的遍历(dfs,bfs)

目录

 1.图的定义和术语

2.案例引入 

1.六度空间理论

3.图的类型定义 

4.图的存储结构 

1.邻接矩阵 

1.无向图的邻接矩阵表示法 

2.有向图的邻接矩阵表示法

3.网(有权图)的邻接矩阵表示法 

代码示例:

 2.采用邻接矩阵表示法创建无向图

代码示例:

3.邻接表

1. 邻接表表示法(链式)

练习 

2.邻接表存储表示 

1.顶点的结点结构 

2.弧(边)的结点结构 

 3.图的结构定义

代码示例:

 3.邻接表操作举例

4.采用邻接表表示法创建无向网 

代码示例: 

5.邻接表特点 

 6.临界矩阵与邻接表表示法的关系

5.十字链表 (用于有向图)

6.邻接多重表 

7.图的遍历 

1.DFS 

代码示例:

 

2.BFS 

代码示例:

 

8.总的代码

 


f44133c10f694ede9f45f744bd23a20e.png

 1.图的定义和术语

964d8b6a8bc54874b2704b3d19d293d3.png

95d9415c60054508946b74822aa9b39d.png

dec5edf9c0c447549a2ac9ff681bd2f5.png

b16fd9378a28439f8e00ab7dcdd5cadf.png

23ee63770ee840a1b26a04209eb8686d.png

7ac4dde43de14de08cfa3d6c6fd53add.png

91c1a036eeda4f7088513004c4a1172c.png

9209f6435a764bc8ad8befd88e73fad2.png

50368c3bfeb34002852c3bfad298c8dc.png

ea56324548a044dea9c6fab7c6c82a59.png

a53878561ee84da99d149a59d00542bd.png

d8781a55de3d4621a51ce8bea3676f0c.png

ba361d1d8def49659d0dbfe1a03687be.png

2.案例引入 

1.六度空间理论

c7d1cdcf4af449d48f48d7f999826f17.png

52e5d5b0977f4b45a722f34c2e373de7.png

3.图的类型定义 

c9fa2ea936dd4c2c9fd33ed63f4490c1.png

26581768e66f4c74974442e584b4ef61.png

d9f0eca87b8746cc979062d552737cfe.png

50f76ab813f44c01b26f4b1ea94b2dcf.png

4.图的存储结构 

418632f0a0954eedb8196e62e689011f.png

1.邻接矩阵 

0df600a80b4743b0bb7b4ea0c0b6a53f.png

1.无向图的邻接矩阵表示法 

415d897bbc2a4c4aa78174939ba45b1e.png

2.有向图的邻接矩阵表示法

db649978dd9d4b319caa0a8f6f56e666.png

60c448b83f85493795933212ee9e3ad9.png

3.网(有权图)的邻接矩阵表示法 

bd283f5c020347dea6ac709bbbdf35eb.png

754589c5182a438a8f376577afd2cb2d.png

代码示例:

typedef struct{char vexs[100];int arcs[32767][32767];int vexnum,arcnum;
}amgraph;

 2.采用邻接矩阵表示法创建无向图

825f533e9c854ec2a10c03ffc2816186.png

7834e3d4bbaf423ea0e8bcb316d97b29.png

bb1cfa00ab5a43a8bfe9be4a3493b226.png

bca99be4b36c49f3927eb0b5fa243525.png

0f043c27c61b47019ca23a13565c6180.png

代码示例:
int locatevex(amgraph &g,char u)
{for(int i = 0; i < g.vexnum; i++){if(u == g.vexs[i]) return i;}return -1;
}int createudn(amgraph &g)
{cin >> g.vexnum >> g.arcnum;for(int i = 0; i < g.vexnum; i++){cin >> g.vexs[i];}for(int i = 0; i < g.arcnum; i++)for(int j = 0; j < g.arcnum; j++)g.arcs[i][j] = 32767;for(int k = 0; k < g.arcnum; k++){char v1,v2;int w;cin >> v1 >> v2 >> w;int i = locatevex(g,v1);int j = locatevex(g,v2);g.arcs[i][j] = w;g.arcs[j][i] = w;}return 1;
}

8de41b12972c4df6b76e56ffc7e94bbe.png

0d527c7f97ea4bcc89d1d457779dc27a.png

9464faa1bfe042d6830a57825d4642a5.png

3dee86b438dd4caca61f679733806fc9.png

d37b97846fc447d4b71780fcaf46548c.png

3.邻接表

1. 邻接表表示法(链式)

4820abfefa1d4bbcb135e8158a0ade75.png

337b42159d5e43c8b29a7bbe68fa772d.png

5653b60e0ecf4868b35d16eefc9b721e.png

8de1183c0e1847fcbc41413c4bd864cd.png546a2553e3f94db09fe1bb8a3d078a95.png 

练习 

7cc8f3d5f64b4f7b82291847030dbeed.png

2.邻接表存储表示 

90c00ca9d70a4bcc899e8fe46fa352fe.png

1.顶点的结点结构 

aaa55eea000740e1abd22ef53e5f2940.png

2.弧(边)的结点结构 

03daf8e6948b4df0a075f297e7ee4a73.png

 3.图的结构定义

80e3615fb3d44a2ca2c1e66ffe0fd7a9.png

代码示例:
#define mvnum 100
typedef struct arcnode{int adjvex;struct arcnode* nextarc;int info;
}arcnode;typedef struct{char data;arcnode * firstarc;
}vnode,adjlist[mvnum];typedef struct{adjlist vertices;int vexnum,arcnum;
}algraph;

 3.邻接表操作举例

8002240d86f64deab661ad85a06ca4d0.png

f056a70667c142558992491a57cdccf7.png

4.采用邻接表表示法创建无向网 

b2732bb9bb7a41d6833a1660cae00ec1.png

03b06ede43504c21be11b1c1e78d6ffe.png

代码示例: 
int createudg(algraph &g)
{cin >> g.vexnum >> g.arcnum;for(int i = 1; i <= g.vexnum; i++){cin >> g.vertices[i].data;g.vertices[i].firstarc = NULL;}for(int k = 1; k <= g.arcnum; k++){cin >> v1 >> v2;int i = locatevex(g,v1);int j = locatevex(g,v2);arcnode *p1;p1 = new arcnode;p1 -> adjvex = j;p1 -> nextarc = g.vertices[i].firstarc;g.vertices[i].firstarc = p1;arcnode *p2;p2 = new arcnode;p2 -> adjvex = i;p2 -> nextarc = g.vertices[j].firstarc;g.vertices[j].firstarc = p2;}return 1;
}

e439ba69fb9847e5a7a89d3f8e0672ed.png

5.邻接表特点 

5c4595d39793418fb58833f8be74b28d.png

 6.临界矩阵与邻接表表示法的关系

8a8ea1597948495fa07718c2b0219112.png

d452b5d1491f48c3aa596aaabaae3a34.png

fc92bf5db44d41cfa25ac41d260d5d4e.png

5.十字链表 (用于有向图)

3d283bc3358a43baabce10bdb04e2da0.png

f51faf24427047be852973d3fc0c0621.png

66a4ab714c6942209a6b0d29eb9ad5a9.png

95b2c2453780409691e0cf6e8f620278.png

6.邻接多重表 

34b6f387117440f0a466d86b0f54363b.png

290ddde0416440a3b4dcfce9cba41018.png

7.图的遍历 

0c75b6b0e21a4f62a997fb9b2f99bf87.png

c601023bd91c4eb3b4d8b1d6026355ac.png

fde334242045472a8d3bcd4c54a1f380.png

3564543379dc453caa09c80cc82113f9.png

1.DFS 

8d017db39aa3425fac104ee14f0d81cf.png

190596237c21426287dee5d777e68578.png

3600b143e0754352acf84e2ddb469df1.png

bfcac09ab48b4a31bcafd78ad7465d44.png

ad8dc386bc7a436883a030ef03cd78ac.png

8be6b3b107c0431ca87bd9a59f91ce94.png

c3793886300643ae834e0d40a548d2c5.png

99eba6f3e85f4922a57b49d4b14d01a4.png

代码示例:
void dfs(amgraph g,int v)
{cout << v;visited[v] = true;for(int w = 0; w < g.vexnum; w++){if(g.arcs[v][w] != 0 && !visited[w]) dfs(g,w);}
}

223a92d1b2f248639cbfbcf10eb003f6.png

e07d5d53c9d540f69e652fcc3d25fde5.png

2.BFS 

a45533d14c4a41f39b1fe426975fd208.png  

9f67a8e02fbc4a699dcd12be0bd29465.png

fba45f88168d49a8952be1431aa738f8.png

d2a0dea65e9340c69a0113d87624e733.png

94d3adff4ded437ea19b79b0ba342677.png

35904070fdbe420da562202205b00e8a.png

578bc081a3df4dfa8e354346d9edf6db.png

代码示例:
void bfs(graph g,int v)
{cout << v;visited[v] = true;initqueue(q);enqueue(q,v);while(!queueempty(q)){dequeue(q,u);}for(int w = firstadjvex(g,u); w > 0; w = nextadjvex(g,u,w)){if(!visited[w]){cout << w;visited[w] = true;enqueue(q,w);}}
}

20bc1fef977f405ca3690d04bebd7108.png

6076dab76b504907b044e818bb01accf.png

8.总的代码

#include <iostream>
using namespace std;typedef struct{char vexs[100];int arcs[32767][32767];int vexnum,arcnum;
}amgraph;int locatevex(amgraph &g,char u)
{for(int i = 0; i < g.vexnum; i++){if(u == g.vexs[i]) return i;}return -1;
}int createudn(amgraph &g)
{cin >> g.vexnum >> g.arcnum;for(int i = 0; i < g.vexnum; i++){cin >> g.vexs[i];}for(int i = 0; i < g.arcnum; i++)for(int j = 0; j < g.arcnum; j++)g.arcs[i][j] = 32767;for(int k = 0; k < g.arcnum; k++){char v1,v2;int w;cin >> v1 >> v2 >> w;int i = locatevex(g,v1);int j = locatevex(g,v2);g.arcs[i][j] = w;g.arcs[j][i] = w;}return 1;
}#define mvnum 100
typedef struct arcnode{int adjvex;struct arcnode* nextarc;int info;
}arcnode;typedef struct{char data;arcnode * firstarc;
}vnode,adjlist[mvnum];typedef struct{adjlist vertices;int vexnum,arcnum;
}algraph;int createudg(algraph &g)
{cin >> g.vexnum >> g.arcnum;for(int i = 1; i <= g.vexnum; i++){cin >> g.vertices[i].data;g.vertices[i].firstarc = NULL;}for(int k = 1; k <= g.arcnum; k++){cin >> v1 >> v2;int i = locatevex(g,v1);int j = locatevex(g,v2);arcnode *p1;p1 = new arcnode;p1 -> adjvex = j;p1 -> nextarc = g.vertices[i].firstarc;g.vertices[i].firstarc = p1;arcnode *p2;p2 = new arcnode;p2 -> adjvex = i;p2 -> nextarc = g.vertices[j].firstarc;g.vertices[j].firstarc = p2;}return 1;
}void dfs(amgraph g,int v)
{cout << v;visited[v] = true;for(int w = 0; w < g.vexnum; w++){if(g.arcs[v][w] != 0 && !visited[w]) dfs(g,w);}
}void bfs(graph g,int v)
{cout << v;visited[v] = true;initqueue(q);enqueue(q,v);while(!queueempty(q)){dequeue(q,u);}for(int w = firstadjvex(g,u); w > 0; w = nextadjvex(g,u,w)){if(!visited[w]){cout << w;visited[w] = true;enqueue(q,w);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 表的增删改查

文章目录 一、什么是CRUD&#xff1f;二、新增&#xff08;Create&#xff09;1、单行数据 全列插入2、多行数据 指定列插入3、插入特殊类型 三、查询&#xff08;Retrieve&#xff09;1、全列查询2、指定列查询3、表达式查询4、指定别名5、去重6、排序7、条件查询基本查询&a…

java算法day44 | ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论基础 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包&#xff0c;完全背包是顺序遍历背包。 518. 零钱兑换 II class Solution {public int change(int amount, int[] coin…

IMAP的要点:旅行前需要了解的内容

你是否经常因会议而出差&#xff0c;需要在各种设备上灵活地访问你的电子邮件&#xff1f;如果是的话&#xff0c;你可能会想了解你的电子邮件系统是如何通过使用互联网消息访问协议&#xff08;IMAP&#xff09;来工作的&#xff0c;这样当你不在办公桌前时&#xff0c;你可以…

Java基础 - 代码练习

第一题&#xff1a;集合的运用&#xff08;幸存者&#xff09; public class demo1 {public static void main(String[] args) {ArrayList<Integer> array new ArrayList<>(); //一百个囚犯存放在array集合中Random r new Random();for (int i 0; i < 100; …

SpringCloud - 如何本地调试不会注册到线上环境(Nacos)?

问题描述 有时候我们需要本地调试注册到 Nacos 上&#xff0c;但是会影响线上服务的 Feign 请求打到本地导致不通影响了线上业务。 原因分析 一般最传统的解决方案就是修改本地 bootstrap.yml 的 spring.cloud.nacos.discovery.namespace spring:application:name: app-serv…

jvisualvm 使用教程

之前看过 jvisualvm&#xff0c;但是那个时候对 JVM 并不是很熟悉&#xff0c;后面看了下八股文&#xff0c;看了下 JVM 的相关知识之后&#xff0c;发现多了解点 JVM 的东西&#xff0c;对我们 CRUD 其实是有指导意义的&#xff0c;就比如我们通常会 new 一堆的没有用到的对象…

使用 Spring Email 和 Thymeleaf 技术,向新注册用户发送激活邮件(二)

本篇博客对应“2.2 开发注册功能”小结 对应视频: 开发注册功能 开发注册功能-续 注册功能是相对比较复制的功能&#xff0c;对于一个相对复杂的功能&#xff0c;可以把这个功能进行拆解。把这个功能的流程想清楚&#xff0c;就知道怎么拆解了&#xff1a; 也可以按照请求进行…

[每周一更]-第92期:Go项目中的限流算法

这周五在清明假期内&#xff0c;提前更新文章 很多业务会有限流的场景&#xff0c;比如活动秒杀、社区搜索查询、社区留言功能&#xff1b;保护自身系统和下游系统不被巨型流量冲垮等。 在计算机网络中&#xff0c;限流就是控制网络接口发送或接收请求的速率&#xff0c;它可防…

【算法练习】28:选择排序学习笔记

一、选择排序的算法思想 弄懂选择排序算法&#xff0c;先得知道两个概念&#xff1a;未排序序列&#xff0c;已排序序列。 原理&#xff1a;以升序为例&#xff0c;选择排序算法的思想是&#xff0c;先将整个序列当做未排序的序列&#xff0c;以序列的第一个元素开始。然后从左…

K8S - Deployment 的版本回滚

当前状态 先看deployment rootk8s-master:~# kubectl get deploy -o wide --show-labels NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES …

理解pytorch的广播语义

目录 什么是广播运算 广播的条件 示例 示例1 示例2 示例3 补1 示例4 原位运算 示例5 参与广播运算的两个tensor&#xff0c;必须是从右向左对齐 总结规律 两个tensor可以做广播运算的条件&#xff1a; 两个可以互相广播的tensor运算的步骤&#xff1a; 例子&#x…

【深度学习】深度学习md笔记总结第3篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

整数与浮点数在内存中的存储

整数与浮点数在内存中的存储 一&#xff0c;大小端存储二&#xff0c;整数在内存中的存储三&#xff0c;浮点数在内存中的存储3.1浮点数的存储规则3.2浮点数的存储过程3.2.1有效数字M3.2.2指数E3.2.3浮点数存储的特殊情况4&#xff0c;例题讲解 在C语言的编程中&#xff0c;我们…

分布式系统架构中的相关概念

1.1、衡量网站的性能指标 响应时间&#xff1a;指执行一个请求从开始到最后收到响应数据所花费的总体时间。并发数&#xff1a;指系统同时能处理的请求数量。 并发连接数&#xff1a;指的是客户端向服务器发起请求&#xff0c;并建立了TCP连接。每秒钟服务器连接的总TCP数量请…

Python--Django--说明

Django 是基于python 的 Web 开发框架. &nsbp;   Web开发指的是开发基于B/S 架构, 通过前后端的配合, 将后台服务器上的数据在浏览器上展现给前台用户的应用. &nsbp;   在早期, 没有Web框架的时候, 使用 Python CGI 脚本显示数据库中的数据. Web框架致力于解决一些…

c++宏有什么离谱操作?

Boost.Preprocessor确实是一个非常强大而复杂的C宏库&#xff0c;专门用于元编程&#xff0c;即在编译时进行代码生成和变换。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程不妨点个关注&#xff0c;给个评论222&…

面试总结------2024/04/04

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xff0c;我们可以定义以下…

实验一 Windows 2008虚拟机安装、安装VM Tools、快照和链接克隆、添加硬盘修改格式为GPT

一、安装vmware workstation软件 VMware workstation的安装介质&#xff0c;获取路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1AUAw_--yjZAUPbsR7StOJQ 提取码&#xff1a;umz1 所在目录&#xff1a;\vmware\VMware workstation 15.1.0 1.找到百度网盘中vmwa…

Pandas Dataframe合并连接Join和merge 参数讲解

文章目录 函数与参数分析otheronhowlsuffix, rsuffix, suffixesleft_index, right_index 函数与参数分析 在pandas中主要有两个函数可以完成table之间的join Join的函数如下&#xff1a; DataFrame.join(other, onNone, how‘left’, lsuffix‘’, rsuffix‘’, sortFalse, v…

YOLOv8 UI界面设计+热力图显示

进入可视化设计界面&#xff0c;设计UI pyside6-designer 设计好UI保存&#xff0c;然后通过以下命令将ui文件保存为py pyside6-uic myui.ui > myui.py 通过以下命令将资源文件qrc保存为py pyside6-rcc my_rc.qrc > my_rc.py 写主窗口函数实现功能... 项目基于yol…