目录

图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组 V 存储图中顶点信息,一个二维数组(称为邻接矩阵) A 存储图中的边或弧的信息
设 G=(V,E) 是具有n个顶点的图,顶点的顺序为(v0,v1 ,… ,vn-1),则G的邻接矩阵A:
下图是一个无向图和它的邻接矩阵:
通过观察不难发现:
- 1)无向图的邻接矩阵是一个对称矩阵,且主对角线都为 0 。
- 2)我们要知道某个顶点的度,其实就是这个顶点 Vi 在邻接矩阵中第 i 行(或第 i 列)的元素之相。比如顶点 V1 的度就是 0+1+0+1+0=2 。
- 3)求顶点 vi 的所有邻接点就是将矩阵中第 i 行元素扫描一遍, A[i][j] 为 1 就是邻接点。
下图是一个有向图和它的邻接矩阵:
通过观察不难发现:
- 1)有向图的邻接矩阵不是一个对称矩阵,且主对角线都为 0 。
- 2)有向图讲究入度与出度,顶点 V1 的入度为 1 ,正好是第 V1 列各数之和。顶点 V1 的出度为 2,即第 V1 行的各数之和。
对于带权图来说,若顶点 Vi 和 Vj 之间有边相连,则邻接矩阵中对应项存放着该边对应的权值
下图是有向网图和它的邻接矩阵:
💬 代码演示
通过上文,我们可以定义出邻接矩阵的存储结构:
#define MAXNum 100 //顶点的最大值 typedef char VertexType; //顶点信息为字符类型 typedef struct { VertexType Vex[MAXNum]; //顶点表 int arcs[MAXNum][MAXNum]; //邻接矩阵 int vexnum,arcnum; //顶点数和边数 }MGraph;

当一个图为稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,图的邻接表法结合了序存储和链式存储方法,可以大大减少这种不必要的浪费。邻接表的处理办法:
- 图中顶点用一个一维数组存储,当然也可以用单链表来存储。用数组可以较容易的读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
- 图中每个顶点 vi 的所有邻接点构成一个线性表。由于邻接点的个数不定,所以用单链表存储,无向图称为顶点 vi 的边表,有向图则称为以 vi 为弧尾的出边表。
下图是一个无向图的邻接表结构:
邻接表存储的图具有的特点:
- 邻接表表示不唯一。取决于单链表的创建算法和边的输入次序。
- 对于无向图,邻接表的顶点 vi 对应的第i个链表的边结点数目正好是顶点 vi 的度。
- 对于有向图,邻接表的顶点 vi 对应的第 i 个链表的边结点数目仅是顶点 vi 的出度。入度为所有邻接点域为 i 的边结点的数目。
💬 代码演示
#define MAXVEX 100 //图中顶点数目的最大值 typedef char VertexType; typedef int EdgeType; //边表结点 typedef struct EdgeNode{ int adjvex; //该弧所指向的顶点的下标或者位置 EdgeType weight; //权值,对于非网图可以不需要 struct EdgeNode *next; //指向下一个邻接点 }EdgeNode; //顶点表结点 typedef struct VertexNode{ Vertex data; //顶点域,存储顶点信息 EdgeNode *firstedge //边表头指针 }VertexNode, AdjList[MAXVEX]; //邻接表 typedef struct{ AdjList adjList; int numVertexes, numEdges; //图中当前顶点数和边数 }

十字链表是有向图的一种链式存储结构。
在十字链表中,对应于有向图的每条弧有一个结点,对应每一个顶点也有一个结点。
这些结点的结构如下图所示:
弧结点有五个域:尾域(tailvex)和头域(headvex)分别指示弧尾和弧头这两个结点在图中的位置。链域(hlink)指向弧头相同的下一条弧。链域(tlink)指向弧尾相同的下一条弧。info 域指向该弧的相关信息。
顶点结点中有三个域:data 域存放顶点相关的数据信息。firstin 和 firstout 两个域分别指向以该顶点为弧头或弧尾的第一个弧结点。
有向图的十字链表表示法如下图所示:
十字链表存储的图具有的特点:
- 在十字链表中很容易找到以 V1 为尾的弧,也容易找到以 V1 为头的弧,因而容易求得顶点的出度和入度。
- 图的十字链表表示不是唯一的。
💬 代码演示
#define MAXVEX 100 //图中顶点数目的最大值 typedef char VertexType; typedef int EdgeType; //边表结点 typedef struct EdgeNode{ int adjvex; //该弧所指向的顶点的下标或者位置 EdgeType weight; //权值 struct EdgeNode *next; //指向下一个邻接点 }EdgeNode; //顶点表结点 typedef struct VertexNode{ Vertex data; //顶点域,存储顶点信息 EdgeNode *firstedge //边表头指针 }VertexNode, AdjList[MAXVEX]; //邻接表 typedef struct{ AdjList adjList; int numVertexes, numEdges; //图中当前顶点数和边数 }

邻接多重表是无向图的另一种链式存储结构。
在邻接表中,容易求得顶点和边的各种信息,但在邻接表中求两个顶点之间是否存在边而对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率较低。
与十字链表相似,在临界多重表中,每条边用一个结点表示,其结构如下图所示:
其中,mark 为标志域,可用以标记该条边是否被搜索过;ivex 和 jvex 为该边依附的两个顶点在图中的位置;liink指向下一条依附于顶点 ivex 的边;jlink 指向下一条依附于顶点 jvex 的边,info 为指向和边相关的各种信息的指针域。
每个顶点也用一个结点表示,其结构如下图所示:
其中,data 域存储该顶点的相关信息,firstedge 域指示第一条依附于该顶点的边。
Q:邻接多重表和邻接表有什么区别
A:在邻接多重表中,所有依附于同一顶点的边串联在同一链表中,由于每条边依附于两个顶点,因此每个边结点同时链接在两个链表中。对无向图而言,其邻接多重表和邻接表的差别仅在于,同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点。
无向图的邻接多重表表示法如下图所示:
邻接多重表的各种基本操作的实现和邻接表类似。

边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息。边数组每个数据元素由一条边的起点下标 (begin), 终点下标 (end) 和权 (weight) 组成,如下图所示:
显然边集数组关注的是边的集合,在边集数组中要查找一个顶点的度需要扫描整个边数组,效率并不高。因此它更适合对边依次进行处理的操作,而不适合对顶点相关的操作。
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt