06数据结构——图

6.2图的存储及基本操作

6.2.1邻接矩阵法

图的邻接矩阵存储结构定义如下:

#define MaxVertexNUm 100            //顶点数目的最大值
typedef char VertexType;            //顶点的数据类型
typedef int EdgeType;               //带权图中边上权值的数据类型
typedef struct{VertexType Ver[MaxVertexNum];   //顶点表EdgeType Edge[MaxVertexNum][MaxVertexNum];    //邻接矩阵,边表int vexnum,arcnum;                            //图的当前顶点数和弧数
}MGraph;

6.2.2邻接表法

图的邻接表存储结构定义如下:

#define MaxVertexNum 100                //图中顶点数目的最大值
typedef struct ArcNode{                 //边表结点int adjvex;                         //该弧所指向的顶点的位置struct ArcNode *next;               //指向下一条弧的指针//InfoType info;                    //网的边权值
}ArcNode;
typedef struct VNode{                   //顶点表结点VertexType data;                    //顶点信息ArcNode *first;                     //指向第一条依附该结点的弧的指针
}VNode,AdjList[MaxVertexNum];
typedef struct{AdjList vertices;                   //邻接表int vexnum,arcnum;                  //图的顶点数和弧数
}ALGraph;                               //ALGraph是以邻接表存储的图类型

6.2.3十字链表

6.2.4邻接多重表

6.2.5图存储小结 


6.3图的遍历 

6.3.1广度优先搜索(BFS)

1.广度优先搜索算法的伪代码如下:

bool visited[MAX_VERTEX_NUM];        //访问标记数组
void BFSTraverse(Graph G){           //对图G进行广度优先遍历for(i=0;i<G.vexnum;++i)visited[i]=FALSE;            //访问标记数组初始化InitQueue(Q);                    //初始化辅助队列Qfor(i=0;i<G.vexnum;++i)          //从0号顶点开始遍历if(!visited[i])              //对每个连通分量调用一次BFSBFS(G,i);                //Vi未访问过,从Vi开始BFS
}
void BFS(Graph G,int v){            //从顶点v出发,广度优先遍历图Gvisit(v);                       //访问初始顶点vvisited[v]=TRUE;                //对v做已访问标记EnQueue(Q,v);                   //顶点v入队列Qwhile(!isEmpty(Q)){DeQueue(Q,v);               //顶点v出队列for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测v所有邻接点if(!visited[w]){            //w为v的尚未访问的邻接顶点visit(w);               //访问顶点wvisited[w]=TRUE;        //对w做已访问标记EnQueue(Q,w);           //顶点w入队列}}
}

2.BFS算法求解单源最短路径问题的算法如下:

void BFS_MIN_Distance(Graph G,int u){for(i=0;i<G.vexnum;++i)d[i]=∞;                    //初始化路径长度visited[u]=TRUE; d[u]=0;EnQueue(Q,u);while(!isEmpty(Q)){            //BFS算法主过程DeQueue(Q,u);              //对头元素u出队for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))if(!visited[w]){        //w为u的尚未访问的邻接顶点visited[w]=TRUE;    //设已访问标记d[w]=d[u]+1;        //路径长度加1EnQueue(Q,w);       //顶点w入队}}
}

 6.3.2深度优先搜索(DFS)

1.用递归进行深度优先搜索算法过程如下:

bool visited[MAX_VERTEX_NUM];        //访问标记数组
void DFSTraverse(Graph G){           //对图G进行深度优先遍历for(v=0;v<G.vexnum;++v)visited[v]=FALSE;            //初始化已访问标记数组for(v=0;v<G.vexnum;++v)          //本代码中是从v=0开始遍历if(!visited[v])DFS(G,v);
}
void DFS(Graph G,int v){            //从顶点v出发,深度优先遍历图Gvisit(v);                       //访问顶点vvisited[v]=TRUE;                //设已访问标记for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))if(!visited[w]){            //w为v的尚未访问的邻接顶点DFS(G,w);}
}

6.4图的应用

6.4.1最小生成树

1.通用的最小生成树算法如下:

GENERIC_MST(G){T=NULL;while T 未形成一棵生成树;do 找到一条最小代价边(u,v)并且加入T后不会产生回路;T=T∪(u,v);
}

2.Prim算法

 Prim算法的简单实现如下:

void Prim(G,T){T=∅;                //初始化空树U={w};              //添加任意一个顶点wwhile((V-U)!=∅){    //若树中不含全部顶点设(u,v)是使u∈U与v∈(V-U),且权值最小的边;T=T∪{(u,v)};    //边归入树U=U∪{v};        //顶点归入树}
}

3.Kruskal算法 

 Kruskal算法的步骤如下:

void Kruskal(V,T){T=V;                  //初始化树T,仅含顶点numS=n;               //连通分量数while(numS>1){        //若连通分量数大于1从E中取出权值最小的边(v,u);if{v和u属于T中不同的连通分量){T=T∪{(v,u)};        //将此边加入生成树中numS--;              //连通分量数减1}}
}

6.4.2最短路径

1.Dijkstra算法求单源最短路径问题 

2.Floyd算法求各顶点之间最短路径问题 

Floyd算法实现如下:

//......准备工作,根据图的信息初始化矩阵A和path(如上图)
for(int k=0;k<n;k++){        //考虑以Vk作为中转点for(int i=0;i<n;i++){    //遍历整个矩阵,i为行号,j为列号for(int j=0;j<n;j++){if(A[i][j]>A[i][k]+A[k][j]){    //以Vk为中转点的路径更短A[i][j]=A[i][k]+A[k][j];    //更新最短路径长度path[i][j]=k;               //中转点}}}
}

6.4.3求最短路径小结 

6.4.4有向无环图描述表达式 

6.4.5拓扑排序 

拓扑排序算法的实现如下:

bool TopologicalSort(Graph G){InitStack(S);                //初始化栈,存储入度为0的顶点int i;for(i=0;i<G.vexnum;i++)if(indegree[i]==0)Push(S,i);           //将所有入度为0的顶点进栈int count=0;                 //计数,记录当前已经输出的顶点数while(!isEmpty(S)){          //栈不空,则存在入度为0的顶点Pop(S,i);                //栈顶元素出栈print[count++]=i;        //输出顶点ifor(p=G.vertices[i].firstarc;p;p=p->nextarc){//将所有i指向的顶点的入度减1,并且将入度减为0的顶点压入栈Sv=p->adjvex;  if(!(--indegree[v]))Push(S,v);       //入度为0,则入栈}}//whileif(count<G.vexnum)return false;            //排序失败,有向无环图中有回路elsereturn true;            //拓扑排序成功
}

 6.4.6关键路径

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

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

相关文章

yolov8 c++进行部署

注意使用opencv4.8 手动安装指定版本opencv 官网下载指定版本的source代码&#xff0c;并解压到本地。 解压后执行make命令 mkdir build cd build cmake .. make -j8 sudo make install/etc/ld.so.conf.d/路径下创建任意一个.conf文件&#xff0c;把lib文件的路径写在里面,一…

ideaSSM在线商务管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 在线商务管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…

C/C++程序设计和预处理

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、程序的翻译环境和执行环境 1、什么是程序 2、程序的翻译环境 3、程序的执行环境 三、预处理 1、预定义符…

Banana Pi BPI-W3(Armsom W3)RK3588开当板之调试UART

前言 本文主要讲解如何关于RK3588开发板UART的使用和调试方法&#xff0c;包括UART作为普通串口和控制台两种不同使用场景 一. 功能特点 Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准&#xff0c;完整模块支持以下功能&#xff1a; 支…

Chromium源码由浅入深(一)

工作中需要对Chromium源码、尤其是源码中图形部分进行深入研究&#xff0c;所以借此机会边学习边写文章&#xff0c;分享一下我的实时学习研究Chromium源码的由浅入深的过程。 闲言少叙&#xff0c;书归正传。 通过命令行启动Chrome浏览器&#xff0c;命令及结果如下&#xf…

系统升级数量超微软预期,Win10/11盗版激活被封杀

声明&#xff1a;本文提供的命令、工具来自第三方网站&#xff0c;仅供学习交流使用&#xff0c;下载后24小时内删除&#xff0c;一切非法使用责任由使用者自行承担。 上月底 Win11 迎来了 Moment 4 功能更新&#xff0c;任务栏取消合并居然真的回归了。 巨硬终于妥协&#x…

asp.net网上商城系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio协同过滤设计

一、源码特点 asp.net网上商城系统是一套完善的web设计管理系统系统采用协同过滤算法进行商品推荐&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库 为sqlserver2008&#xff0c;使用c#语言开发 ASP…

ilr normalize isometric log-ratio transformation

visium_heart/st_snRNAseq/05_colocalization/create_niches_ct.R at 5b30c7e497e06688a8448afd8d069d2fa70ebcd2 saezlab/visium_heart (github.com) 更多内容&#xff0c;关注微信&#xff1a;生信小博士 The ILR (Isometric Log-Ratio) transformation is used in the anal…

面试算法40:矩阵中的最大矩形

题目 请在一个由0、1组成的矩阵中找出最大的只包含1的矩形并输出它的面积。例如&#xff0c;在图6.6的矩阵中&#xff0c;最大的只包含1的矩阵如阴影部分所示&#xff0c;它的面积是6。 分析 直方图是由排列在同一基线上的相邻柱子组成的图形。由于题目要求矩形中只包含数字…

网络安全https

http是明文的&#xff0c;相当于在网上裸奔&#xff0c;引出了https&#xff0c;大多数网站都转为了https&#xff0c;连非法的赌博网站有的都是https的。 1.https的网站是不是必须让用户装数字证书&#xff1f; 答&#xff1a;分两种&#xff0c;一种是单向认证&#xff0c;像…

2023高频前端面试题-vue

1. 什么是 M V VM Model-View-ViewModel 模式 Model 层: 数据模型层 通过 Ajax、fetch 等 API 完成客户端和服务端业务模型的同步。 View 层: 视图层 作为视图模板存在&#xff0c;其实 View 就是⼀个动态模板。 ViewModel 层: 视图模型层 负责暴露数据给 View 层&…

移远通信5G RedCap模组拿下首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日&#xff0c;在2023世界物联网博览会期间&#xff0c;中国移动举办了以“智融万物 创见未来”为主题的物联网开发者大会暨物联网产业论坛。作为中国移动在物联网领域重要的合作伙伴&#xff0c;移远通信应邀参加论坛。 随着千行百业数智化进程的不断加速&#xff0c;5G…

什么是web3.0?

Web 3.0&#xff0c;也常被称为下一代互联网&#xff0c;代表着互联网的下一个重大演变。尽管关于Web 3.0的确切定义尚无共识&#xff0c;但它通常被认为是一种更分散、更开放且更智能的互联网。 以下是Web 3.0的一些主要特征和概念&#xff1a; 1. 去中心化 Web 3.0旨在减少…

达芬奇MacOS最新中文版 DaVinci Resolve Studio 18中文注册秘钥

DaVinci Resolve Studio 18是一款专业的视频编辑软件&#xff0c;它具有多种强大的功能。首先&#xff0c;它提供了丰富的视频剪辑工具&#xff0c;如剪切、复制、粘贴、剪辑、缩放和移动等&#xff0c;使用户可以轻松地剪辑和组合视频素材。其次&#xff0c;该软件还支持多个轨…

搜维尔科技:伦敦艺术家利用Varjo头显捕捉盲人隐藏的梦想

在伦敦举行的弗里泽艺术博览会上,与专业级虚拟现实/XR硬件和软件领域的全球领先者Varjo合作,展示一个突破性的混合现实艺术装置, 皇家国家盲人学会 (rnib),英国领先的视力丧失慈善机构。 这个名为"公共交通的私人生活"的装置是一个互动的声音和图像雕塑,旨在让有眼光…

AI小百科 - 什么是词向量?

如何表示一个单词的意义&#xff1f;对人来说&#xff0c;一般用解释法&#xff0c;用一段话来解释词的含义。如“太阳”在新华字典中的释义是“太阳系的中心天体。银河系的一颗普通恒星。”然而&#xff0c;这样的解释计算机是听不懂的&#xff0c;必须用更简洁的方式来对词义…

Unity3D 打包发布时生成文件到打包目录

有时候需要自己创建批处理文件或日志文件&#xff0c;在启动程序的同级目录使用&#xff0c;减少手动操作的时间和错误率。主要使用到的是OnPostprocessBuild方法。 1、在工程中的Editor文件夹下创建脚本 2、将文件放入Plugins的相关目录 3.脚本内容 using System.Collection…

智慧垃圾站:AI视频智能识别技术助力智慧环保项目,以“智”替人强监管

一、背景分析 建设“技术先进、架构合理、开放智能、安全可靠”的智慧环保平台&#xff0c;整合环境相关的数据&#xff0c;对接已建业务系统&#xff0c;将环境相关数据进行统一管理&#xff0c;结合GIS技术进行监测、监控信息的展现和挖掘分析&#xff0c;实现业务数据的快速…

3ds Max2023安装教程(最新最详细)

目录 一.简介 二.安装步骤 软件&#xff1a;3ds Max版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;6.85G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU3GHz 内存16G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a; …

UMMKD

方法 对于“Y”形模型&#xff0c;绿线之前的层是分开的&#xff0c;绿线之后的层在模态之间共享。对于“X”形模型&#xff0c;第一条蓝线之前和第二条蓝线之后的层是分开的&#xff0c;蓝线之间的层在模态之间共享 作者未提供数据