算法:图的相关算法

图的相关算法

  • 1. 图的遍历算法
    • 1.1 深度优先搜索
    • 1.2 广度优先搜索
  • 2. 最小生成树求解算法
    • 普里姆(Prim)算法
    • 克鲁斯卡尔(Kruskal)算法
  • 3. 拓扑排序
  • 4. 最短路径算法

1. 图的遍历算法

图的遍历是指从某个顶点出发,沿着某条搜索路径对图中的所有顶点进行访问且只访问次的过程。
图的遍历算法是求解图的连通性问题、拓扑排序及求关键路径等算法的基础。
图的遍历要比树的遍历复杂得多。因为图的任一个结点都可能与其余顶点相邻接,所以在访问了某个顶点之后,可能沿着某路径又回到该结点上,为了避免对顶点进行重复访问,在图的遍历过程中必须记下每个已访问过的顶点。深度优先搜索和广度优先搜索是两种遍历图的基本方法。

1.1 深度优先搜索

类似树的先根遍历,在第一次经过一个顶点时就进行访问操作。遍历步骤如下:

  1. 设置搜索指针 p,使p指向顶点。
  2. 访问p所指顶点,并使p指向与其相邻接的且尚未被访问过的顶点。
  3. 若p所指顶点存在,则重复步骤(2),否则执行步骤(4)。
  4. 沿着刚才访问的次序和方向回溯到一个尚有邻接顶点且未被访问过的顶点,并使p指向这个未被访问的顶点,然后重复步骤(2),直到所有的顶点均被访问为止。
int visited[MaxN] = {0};  //调佣遍历算法前设置所有的顶点都被访问过
void Dfs(Graph G, int i)
{
	EdgeNode *t; int j;
	printf("%d",i);               //访问序号为i的顶点
	visited[i] = 1;               //序号为i的顶点已被访问过
	t = G.Vertices[i].firstarc;   //取顶点i的第一个邻接顶点
	while(t!=NULL){               //检查所有与顶点i相邻接的顶点
	j=t->adjvex;                 //顶点j为顶点i的一个邻接顶点
	if(visited[j]==0)           //若顶点j未被访问则从顶点j出发进行深度优先搜索
		Dfs(G,j);
	t=t->nextarc;              //取顶点i的下一个邻接顶点
	}
}

1.2 广度优先搜索

图:广度优先搜索

图的广度优先搜索方法为:从图中的某个顶点v出发,在访问了之后依次访问v的各个未被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问的顶点的邻接点都被访问到。若此时还有未被访问的顶点,则另选图中的一个未被访问的顶点作为起点,重复上述过程,直到图中所有的顶点都被访问到为止。
广度优先遍历图的特点是尽可能先进行横向搜索,即最先访问的顶点的邻接点也先被访问。为此,引入队列来保存已访问过的顶点序列,即每当一个顶点被访问后,就将其放入队列中,当队头顶点出队时,就访问其未被访问的邻接点并令这些邻接顶点入队。

void Bfs(Graph G)
{
	EdgeNode *t; int i,j,k;
	int visited[MaxN]={0};          //调用遍历算法前设置所有的顶点都没有被访问过
	initQueue(Q);                  //创建一个空队列
	for(i=0;i<G.Vnum;i++)
	{
		if(!visited[i]){               //顶点i未被访问过
			enQueue(Q,i);
			printf("%d",i);visited[i]=1;    //访问顶点i并设置已访问标志
			while(!isEmpty(Q)){            //若队列不空,则继续取顶点进行广度优先搜索
				deQueue(Q,k);
				t=G.Vertices[k].firstarc;
				for(;t;t=t->nextarc){      //检查所有与顶点K相邻接的顶点
					j=t->adjvex;           //顶点j是顶点k的一个邻接顶点
					if(visited[j]==0){     //若顶点j未被访问过,将j加入队列
						enQUeue(Q,j);
						printf("%d",j);    //访问序号为j的顶点并设置已访问标志
						visited[j]=1;
					}
				}
			}
		}
	}
}

2. 最小生成树求解算法

在这里插入图片描述
生成树:设图G=(V,E)是个连通图,如果其子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。
对于有n个顶点的连通图,至少有 n-1 条边,而生成树中恰好有 n-1条边,所以连通图的生成树是该图的极小连通子图。若在图的生成树中任意加一条边,则必然形成回路。
图的生成树不是唯一的。对于非连通图而言,每个联通分量中的顶点集和遍历时走过的边集一起构成若干棵生成树,把它们称为非连通图的生成树森林。

最小生成树:对于连通网来说,边是带权值的,生成树的各边也带权值,于是就把生成树各边的权值总和称为生成树的权,把权值最小的生成树称为最小生成树。求解最小生成树有许多实际的应用。普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法是两种常用的求解最小生成树算法。

普里姆(Prim)算法

在这里插入图片描述

克鲁斯卡尔(Kruskal)算法

在这里插入图片描述
在这里插入图片描述

3. 拓扑排序

在工程领域,一个大的工程项目通常被划分为许多较小的子工程(称为活动),当这些子工程都完成时,整个工程也就完成了。若以顶点表示活动,用有向边表示活动之间的优先关系,则称这样的有向图为以顶点表示活动的网(Activity On Vertex network,AOV 网)。在有向网中若从顶点 v i v_i vi到顶点 v j v_j vj有一条有向路径,则顶点 v i v_i vi v j v_j vj的前驱,顶点 v j v_j vj v i v_i vi的后继。若 < v i , v j > <v_i,v_j> <vi,vj>是网中的一条弧,则顶点 v i v_i vi v j v_j vj的直接前驱,顶点 v j v_j vj v i v_i vi的直接后继。AOV 网中的弧表示了活动之间的优先关系,也可以说是一种活动进行时的制约关系。

在 AOV 网中不应出现有向环、回路若存在的话,则意味着某项活动必须以自身任务的完成为先决条件,显然这是荒谬的。因此,若要检测一个工程划分后是否可行,首先就应检查对应的AOV 网是否存在回路。检测的方法是对其 AOV 网进行拓扑排序。
在这里插入图片描述
对一个有向图进行拓扑排序的结果会有两种情况:

  1. 一种是所有顶点已输出,此时整个拓扑排序完成,说明网中不存在回路;
  2. 另一种是尚有未输出的顶点,剩余的顶点均有前驱顶点,表明网中存在回路,拓扑排序无法进行下去。

4. 最短路径算法

狄克斯特拉算法

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

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

相关文章

智能语音机器人智能在哪里?AI人工智能电话机器人部署

随着科技的不断进步&#xff0c;人工智能已经成为了我们生活中不可或缺的一部分。AI人工智能机器人电话正是其中的一种形式&#xff0c;可以帮助企业或组织更好地实现电话营销的目标&#xff0c;那么智能语音机器人智能在哪里?我们来看看&#xff1a; 智能语音机器人&#xf…

半波正弦信号的FFT变换

目录 Hello&#xff0c; 大家好&#xff0c;这一期我们谈谈半波正弦信号的FFT变化长什么样子。本文硬件使用GFARM02硬件模块[1]&#xff0c;文章最后有其淘宝链接。核心器件为STM32F103RCT6&#xff0c;为Cortex-M3核&#xff0c;采用的CMSIS版本为CMSIS_5-5.6.0。 如图1所示&…

计算机网络:网络层 —— 移动 IP 技术

文章目录 IPv6IPv6 的诞生背景主要优势IPv6引进的主要变化 IPv6数据报的基本首部IPv6数据报首部与IPv4数据报首部的对比 IPv6数据报的拓展首部IPv6地址IPv6地址空间大小IPv6地址的表示方法 IPv6地址的分类从IPv4向IPv6过渡使用双协议栈使用隧道技术 网际控制报文协议 ICMPv6ICM…

window 利用Putty免密登录远程服务器

1 在本地电脑用putty-gen生成密钥 参考1 参考2 2 服务器端操作 将公钥上传至Linux服务器。 复制上述公钥到服务器端的authorized_keys文件 mkdir ~/.ssh vi ~/.ssh/authorized_keys在vi编辑器中&#xff0c;按下ShiftInsert键或者右键选择粘贴&#xff0c;即可将剪贴板中的文…

词嵌入模型:Skip-Gram模型和CBOW模型

目录 Skip-Gram模型和CBOW模型 一、实现方式 二、训练目标 三、应用场景选择 Skip-Gram模型和CBOW模型 都是Word2Vec的两种实现方法,它们的确在实现方式和训练目标上有所不同,但共同的目标都是学习词汇的分布式表示(即词向量),以便捕捉词与词之间的语义和句法关系。以…

使用docker安装zlmediakit服务(zlm)

zlmediakit安装 zlmediakit安装需要依赖环境和系统配置&#xff0c;所以采用docker的方式来安装不容易出错。 docker pull拉取镜像(最新) docker pull zlmediakit/zlmediakit:master然后先运行起来 sudo docker run -d -p 1935:1935 -p 80:80 -p 8554:554 -p 10000:10000 -p …

微信小程序 uniapp+vue老年人身体监测系统 acyux

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 过此方式促进老年人辅助程序信息流动和数据传输效率&#xff0c;提供一个内容丰富、功能多样、易于操作的老年人辅助程序…

什么是Scaling Law,谈谈你对它的理解

1. 什么是Scaling Law 1.1 Scaling Law的目标 Having a sense of the capabilities of a model before training can improve decisions around alignment, safety, and deployment. — GPT4 Technical Report 在训练之前了解模型的能力&#xff0c;以改善关于大模型的对齐、…

Postgresql源码(137)执行器参数传递与使用

参考 《Postgresql源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 0 总结速查 prepare p_04(int,int) as select b from tbl_01 where a $1 and b $2为例。 custom计划中&#xff0c;在表达式计算中使用参数的值&#xff0c;因为custom计划会带参数值&…

MMBench-Video:上海 AI Lab 联合多所高校推出长视频理解基准测试工具,全面评估 LVLMs 视频理解的能力

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

【万字详文介绍】:迭代扩张卷积神经网络(IDCNN)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

明源地产ERP WFWebService.asmx 反序列化RCE漏洞复现

0x01 产品简介 明源地产ERP是一款专为房地产行业设计的企业资源规划(ERP)系统,系统集成了项目管理、财务管理、客户关系管理、营销管理等多个模块,旨在帮助房地产企业提升运营效率、降低成本和提高客户满意度。它充分考虑了房地产行业的特性和需求,通过整合企业的各个业务…

AIGC时代LaTeX排版的应用、技巧与未来展望

文章目录 一、LaTeX简介与基础设置二、常用特殊符号与公式排版三、图片与表格的插入与排版四、自动编号与交叉引用五、自定义命令与样式六、LaTeX在AIGC时代的应用与挑战七、LaTeX的未来展望《LaTeX 入门实战》内容简介作者简介目录前言/序言读者对象本书内容充分利用本书 在AI…

redis:set集合命令,内部编码,使用场景

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码使用场景总结 前言…

智慧工地:引领工地管理和监测的革新

一、智慧工地是什么 智慧工地是智慧地球理念在工程领域的具体应用&#xff0c;是工程全生命周期管理的崭新理念。通过运用信息化手段&#xff0c;智慧工地利用三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;重点关注施工过程管理&#xff0c;建立互联协同、智能生…

如何在Linux系统中使用Netcat进行网络调试

文章目录 Netcat简介安装Netcat在Debian/Ubuntu系统中安装在CentOS/RHEL系统中安装 Netcat基本命令Netcat基本用法示例1&#xff1a;监听端口示例2&#xff1a;连接到远程主机 Netcat选项-l选项-p选项-v选项 Netcat模式监听模式连接模式 Netcat排除和包含排除端口包含端口 Netc…

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…

多核架构的基本概念

目录 1.为什么使用多核 2.多核分类 2.1 同构和异构 2.2 SMP和AMP 3 小结 1.为什么使用多核 这个问题个人认为可以从两个方面来看&#xff1a; 性能问题 随着汽车ECU对集成化的要求越来越高&#xff0c;把多个ECU功能集中到一个多核MCU的需求也越来越明显。 以汽车制动…

NeurIPS 2024 | 机器人操纵世界模型来了,成功率超过谷歌RT-1 26.6%

对于人类而言&#xff0c;一旦掌握了 “打开瓶盖” 的动作&#xff0c;面对 “拧紧螺丝” 这样的任务通常也能游刃有余&#xff0c;因为这两者依赖于相似的手部动作。然而&#xff0c;对于机器人来说&#xff0c;即使是这样看似简单的任务转换依然充满挑战。例如&#xff0c;换…