首先,我应该说我不熟悉图论,而且我的数学知识也很差。无论如何,我正在使用图概念进行分析。
基本上,我将无向图(例如G)分解为循环(封闭图)。我的循环的特长是它们是一个可以在两个顶点之间移动的最短循环(因为它们是循环,因此开始和结束是相同的)。根据我的示例图,我的周期是(1,4,5,1)(1,2,3,4,1)(7,9,8,7)(我忽略了长度小于3的周期) 。
编辑:我使用深度优先搜索来获取周期,然后得到最小的周期。
后来,我进一步将这些循环制动为有向路径。在这里,我打破了循环的边缘(图中的红线),以便为新的路径图插入起点和终点。因此对于周期(7,9,8,7)=>新的有向路径为(a,9,c)(d,8,7,b)
编辑:仅针对选定的循环执行进一步的中断。它只是插入一个新的 vector 并更新元素。任何与图论相关的算法都在这里不涉及。
然后,我对数据进行一些分析。
我正在尝试和谷歌搜索,但仍然找不到描述我所做的方法。我想,我所做的事情对您来说很清楚。
具有数学符号(根据图论)
我已经看到许多作者使用不同的符号和符号来定义图形及其子图形,但是对我来说,我无法定义基本内容太差的东西。因此,请帮助我以正式的数学方式讲这些事情。提前致谢。
我也插入了示例图以了解想法。
注意:我添加了c++标记,因为许多计算机科学家使用图论,并且希望对此做出回应。
最佳答案
尝试将操作进行数学描述时可能遇到的第一个问题是“最短循环”的定义,因为循环通常定义为由边连接的顶点序列,其中第一个也是最后一个。
数学速成类
在数学中,图通常由两组V(如顶点)和E(如边)描述
集E由具有两个元素的集合组成,每个元素都是一个顶点。
如
E中的每个集合都对应于图形中的一条边。
因此,(连接的)路径通常定义为:
顶点序列v1,...,vn具有以下属性:对于序列vi和vi + 1中的每两个连续顶点,集合{vi,vi + 1}是集合E的元素。
(实际上:从顶点vi到顶点vi + i有一条边)
通常将循环定义为具有以下属性的路径:v1 = vn(因此第一个顶点也是最后一个顶点)
这个定义已经是您的示例序列了:1,4,1形成一个循环(在数学意义上)
因此,图形中的每个边都将被视为“最短”周期,而给出的示例肯定更长!
你说过
作为您描述的起点,这看起来不错。不幸的是,我不完全了解您要执行的下一步。
忠告
我的建议,或者至少是我解决问题的方法,是将相当长的描述转换为某种较短的算法描述,同时精确地定义如何尝试执行任务。通过这种方式到达您的最终描述并不难。特别是不要忘记告诉您算法的确切输入是什么。即使从您的描述来看,这似乎也不太清楚。
特别是不要忘记讲述故事的这一部分是否适用,因为它似乎是解决问题的最关键的部分之一。
关于c++ - 将图分成周期然后分成路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15160640/