数据结构——图的概念,图的存储结构,图的遍历(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);
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSM学习——Spring JDBC

Spring JDBC 概念 Spring的JDBC模块负责数据库资源管理和错误处理&#xff0c;简化了开发人员对数据库的操作。 Spring JDBC通过配置数据源和JDBC模板来配置。 针对数据库操作&#xff0c;Spring框架提供了JdbcTemplate类&#xff0c;它是Spring框架数据抽象层的基础&#…

基因组de novo组装

分以下几个部分&#xff1a; CLR组装 HIFI组装 ONT组装 二、三代数据矫正 组装结果评估 一、CLR组装 下机数据&#xff1a; 主要用那个bam文件 软件&#xff1a;wtdbg2 第一步&#xff1a;bam转fasta文件 参考&#xff1a;https://www.jianshu.com/p/03c7eb11102d # 进行基…

kali 渗透工具 - mestaploit

永恒之蓝漏洞的小知识&#xff1a; 黑客通过改造 永恒之蓝 制作 wannacry 制作病毒入侵高校内网。 mestaploit 攻击永恒之蓝流程&#xff1a; 使用模块 msfconsole配置required 模块参数运行&#xff0c;开始监听主机 msfconsole 主要模块 - 选择使用模块 search ms17_01…

VSCode 插件 Template String Converter

1. 插件介绍 点击安装 Template String Converter 插件 Template String Converter 翻译后&#xff1a;模板字符串转换器。 插件作用&#xff1a;当 JavaScript 字符串中键入 ${ 时自动将引号转为反引号&#xff0c;当删除 ${ 时自动将反引号转为普通引号 功能示例&#xff…

【T5中的激活函数】GLU Variants Improve Transformer

【mT5中的激活函数】GLU Variants Improve Transformer 论文信息 阅读评价 Abstract Introduction Gated Linear Units (GLU) and Variants Experiments on Text-to-Text Transfer Transformer (T5) Conclusion 论文信息 名称内容论文标题GLU Variants Improve Transfo…

【保姆级介绍Oracle】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

DeepWalk论文翻译

DeepWalk论文翻译 DeepWalk: Online Learning of Social Representations DeepWalk&#xff1a;社会表征的在线学习 ABSTRACT 我们提出了 DeepWalk&#xff0c;一种学习网络中顶点潜在表示的新方法。这些潜在表示在连续向量空间中对社会关系进行编码&#xff0c;很容易被统…

蓝桥杯第十五届抱佛脚(九)动态规划

蓝桥杯第十五届抱佛脚&#xff08;九&#xff09;动态规划 基本概念 动态规划(Dynamic Programming, DP)是一种用于解决复杂问题的优化算法设计技术。它将原问题分解为若干相互重叠的子问题,通过记录子问题的解,避免重复计算,从而大大减少了计算量。 动态规划典型的应用场景…

Python | SLP | EOF | 去除季节趋势

EOF & PC 前言 在计算EOF&#xff08;经验正交函数&#xff09;之前去除季节循环是为了消除数据中的季节变化的影响&#xff0c;使得EOF能够更好地捕捉数据中的空间变化模式。如果不去除季节循环&#xff0c;季节性信号可能会在EOF中占据较大的比例&#xff0c;从而影响对其…

【Greenplum】GP库 too many clients already错误,重启失败问题解决方案

问题描述&#xff1a; 连接数满了后&#xff0c;导致 gp库无法连接了&#xff0c;通过登录服务器&#xff0c;使用gpadmin用户进行重启操作&#xff0c;也报too many clients already&#xff0c;无法重启。 采用 psql -d postgres -U gpadmin 连接库&#xff0c;也报too man…

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储&#xff0c;这个是一个了解c语言内部的知识点&#xf…

element-ui breadcrumb 组件源码分享

今日简单分享 breadcrumb 组件的源码实现&#xff0c;主要从以下三个方面&#xff1a; 1、breadcrumb 组件页面结构 2、breadcrumb 组件属性 3、breadcrumb 组件 slot 一、breadcrumb 组件页面结构 二、breadcrumb 组件属性 2.1 separator 属性&#xff0c;分隔符&#xff…

Golang | Leetcode Golang题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; func isMatch(s string, p string) bool {m, n : len(s), len(p)matches : func(i, j int) bool {if i 0 {return false}if p[j-1] . {return true}return s[i-1] p[j-1]}f : make([][]bool, m 1)for i : 0; i < len(f); i {f[i] m…

python--IO流和字符流的写入写出

1.IO流&#xff1a;&#xff08;input output stream&#xff09; python的IO流只有一个函数&#xff1a;open函数 属性不用带括号&#xff1b;方法通通要带括号 输入输出流&#xff1a;狭义上来说&#xff0c;指的就是内存数据和磁盘这种可以永久 存储数据的设备 IO流 IO流…

[C#]OpenCvSharp使用HoughCircles霍夫圆检测算法找出圆位置并计数

【效果展示】 原图&#xff1a; 找出位置&#xff1a; 【测试环境】 vs2019,netframework4.7.2,opencvsharp4.8.0 【函数用法】 cv2提供了一种圆检测的方法&#xff1a;HoughCircles。该函数的返回结果与参数设置有很大的关系。 检测的图像时9枚钱币&#xff0c;分别使用了…

Codeforces Round 931 (Div. 2) ---- E. Weird LCM Operations ---- 题解

E. Weird LCM Operations&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 这是一道构造题&#xff0c;那么观察这个构造有啥性质&#xff0c;观察到最多操作次数为 n/6 5&#xff0c;然后每次操作需要选择三个数&#xff0c;如果每次操作的三个数都不和之前的重复的…

算法-最值问题

#include<iostream> using namespace std; int main() {int a[7];//上午上课时间int b[7];//下午上课时间int c[7];//一天总上课时间for (int i 0; i < 7; i) {cin >> a[i] >> b[i];c[i] a[i] b[i];}int max c[0];//max记录最长时间int index -1;//索…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

震惊!!原来阻塞队列消息队列这样理解会更简单!!!

震惊!!原来阻塞队列&&消息队列这样理解会更简单!!! 一:阻塞队列二:消息队列2.1:生产者消费者模型2.1.1:解耦合:2.1.2:削峰填谷: 三:消息队列代码3.1.13.1.2:3.1.3:生产慢,消费快,消费阻塞3.1.3:生产快,消费慢,生产阻塞 二级目录二级目录 一:阻塞队列 阻塞队列:先进先出…

能耗监测管理系统与技术方案

能耗监测管理系统是目前能源管理中重要的技术手段&#xff0c;它通过集成现代监测技术和信息技术&#xff0c;实现对能源消耗的实时监控、数据分析和决策支持&#xff0c;帮助企业或机构实现能源的高效管理和节能降耗。本篇文章将从能耗监测管理系统的组成、关键技术、应用领域…