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

news2024/10/11 2:18:28

目录

 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.coloradmin.cn/o/1567869.html

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

相关文章

【Qt 学习笔记】认识QtSDK中的重要工具

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号&#xff1a;Qt 学习笔记 / 03 文章目…

单例模式以及线程安全问题

单例模式的概念 单例模式是指的是整个系统生命周期内&#xff0c;保证一个类只能产生一个实例对象 保证类的唯一性 。 通过一些编码上的技巧&#xff0c;使编译器可以自动发现咱们的代码中是否有多个实例&#xff0c;并且在尝试创建多个实例的时候&#xff0c;直接编译出错。 …

哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…

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

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

第十二篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化操作Word

传奇开心果系列博文 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化操作Word介绍二、使用python-docx示例代码二、**使用win32com示例代码**三、使用comtypes示例代码四、使用docx-mailmerge示例代码五、基本操作示例代码六、高级操作示例代码…

mysql 磁盘空间100%

MySQL大事务可能会导致过多的占用临时文件&#xff0c;导致磁盘空间撑满的问题 本例说明下binlog cache产生的临时文件 案例复现 调小binlog_cache_size&#xff0c;让DML使用临时文件 使用存储过程模拟大事务 创建表 create table t1( id int AUTO_INCREMENT, name varchar…

文献阅读:将条形码神经解剖学与空间转录分析相结合,可以识别投射神经元相关基因

文献介绍 「文献题目」 Integrating barcoded neuroanatomy with spatial transcriptional profiling enables identification of gene correlates of projections 「研究团队」 Anthony M. Zador&#xff08;美国冷泉港实验室&#xff09; 「发表时间」 2021-05-10 「发表期…

【蓝桥杯-枚举模板题】

蓝桥杯-枚举模板题 滑雪课程设计 P3650新的家乡 P8587枚举子集 B3622Air Cownditioning P9011 滑雪课程设计 P3650 核心的思路是把数据规定在[i,i17]里&#xff0c;不够的补&#xff0c;过大的减。枚举i以求最少的钱。 #include<bits/stdc.h> using namespace std;int n…

编程生活day6--回文子串、蛇形填充数组、笨小猴、单词排序

回文子串 题目描述 给定一个字符串&#xff0c;输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串&#xff0c;比如&#xff1a;abba&#xff0c;cccdeedccc都是回文字符串。 输入 一个字符串&#xff0c;由字母或数字组成。长度5…

剖析C++中的菱形继承

剖析C中的菱形继承 文章目录 剖析C中的菱形继承前言菱形继承虚拟继承与虚基表总结 前言 在面向对象编程中&#xff0c;继承允许我们构建出复杂的类关系和对象模型。然而&#xff0c;当多个类继承自同一个基类时&#xff0c;可能会引发结构上的冲突和数据冗余。这种情况在C中被…

基于深度学习的番茄新鲜度检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的番茄新鲜度检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streaml…

Dockerfile详解构建镜像

Dockerfile构建企业级镜像 在服务器上可以通过源码或rpm方式部署Nginx服务&#xff0c;但不利于大规模的部署。为提高效率&#xff0c;可以通过Dockerfile的方式将Nginx服务封装到镜像中&#xff0c;然后Docker基于镜像快速启动容器&#xff0c;实现服务的快速部署。 Dockerf…

Python机器学习实验 Python 数据分析

1.实验目的 掌握常见数据预处理方法&#xff0c;熟练运用数据分析方法&#xff0c;并掌握 Python 中的 Numpy、 Pandas 模块提供的数据分析方法。 2.实验内容 1. Pandas 基本数据处理 使用 Pandas 模块&#xff0c;完成以下操作。 &#xff08;1&#xff09;创建一个由 0 到 50…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了&#xff0c;烦闷的时候&#xff0c;看到使用 AI 进行作图&#xff0c;可以使用本地话部署。刚好自己家里的电脑&#xff0c;之前买来玩暗黑4&#xff0c;配置相对来说来可以&#xff0c;就拿来试试。 此篇是按照 Github 上的 stable-d…

【智能算法】磷虾群算法(KHA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;Gandomi等人受到自然界中磷虾生存行为启发&#xff0c;提出了磷虾群算法&#xff08;Krill Herd Algorithm, KHA&#xff09;。 2.算法原理 2.1算法思想 KHA受南极鳞虾群觅食行…

软件测试用例(2)

具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…

【C++】C++11类的新功能

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 默认成员函数 类成…

2024年阿里云服务器购买、续费、升级优惠活动价格表

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

计算机网络——32差错检测和纠正

差错检测和纠正 错误检测 EDC 差错检测和纠错位&#xff08;冗余位&#xff09; D 数据由差错检测保护&#xff0c;可以包含头部字段 错误检测不是100%可靠的 协议会泄露一些错误&#xff0c;但是很少更长的EDC字段可以得到更好的检测和纠正效果 奇偶校验 单bit奇偶校验 …

【办公类-47-01】20240404 Word内部照片批量缩小长宽(课题资料系列)

作品展示 背景需求 最近在做《运用Python优化3-6岁幼儿学习操作材料的实践研究》的课题研究资料&#xff08;上半学期和下半学期&#xff09;。 将CSDN里面相关的研究照片文字贴入Word后&#xff0c;就发现一张图片就占了A4竖版一页&#xff0c;太大了。我想把word里面的所有…