C++ 如何在图网络中寻找闭合环

C++ 如何在图网络中寻找闭合环,c++,xcode,cocoa,loops,graph,C++,Xcode,Cocoa,Loops,Graph,我有一个由街道和交叉口组成的无向图网络,我想知道是否有任何算法可以帮助我找到闭环,即我可以放置建筑物的地方。 感谢您的帮助,谢谢 这是Boost图形库中的标准函数。有关详细信息,请参阅。这是Boost图形库中的标准函数。有关详细信息,请参见。根据对我先前答案的评论: 这些图似乎都是无向的和平面的,也就是说,可以嵌入到一个二维平面中而不需要交叉边,并且给出了一个这样的嵌入。这种嵌入将分割平面。例如,图8将平面划分为三个区域:两个“内部”区域和一个无限外部区域。另一种观点是,节点的所有边都是循环排序

我有一个由街道和交叉口组成的无向图网络,我想知道是否有任何算法可以帮助我找到闭环,即我可以放置建筑物的地方。
感谢您的帮助,谢谢

这是Boost图形库中的标准函数。有关详细信息,请参阅。

这是Boost图形库中的标准函数。有关详细信息,请参见。

根据对我先前答案的评论:

这些图似乎都是无向的和平面的,也就是说,可以嵌入到一个二维平面中而不需要交叉边,并且给出了一个这样的嵌入。这种嵌入将分割平面。例如,图8将平面划分为三个区域:两个“内部”区域和一个无限外部区域。另一种观点是,节点的所有边都是循环排序的。(这是允许我们应用图论的基本部分)

分区必须由一个循环包围,但并非所有循环都可以将单个区域分区。然而,在图8的小例子中,所有三个区域都与一个不同的循环直接相关

输入图形通常可以简化。有些节点可能只有一条边;它们不能用于分区,可以与边缘一起删除。其他节点有两条边连接不同的节点。这里,节点和两条边可以替换为连接相邻节点的直接边。即,图8的图形可以简化为两个节点和它们之间的三条边。(这不是必要的步骤,但有助于计算)

现在,每个顶点的两边都有两个区域(因为它们是无向的,“左”和“右”没有明显的区别)。因此,对于<代码> v</COD>顶点,我们需要考虑<代码> 2×v v < /代码>边。它们通常不明显。如果两条相邻边(连接到同一节点)在该节点边的循环顺序中也是相邻的,则它们可以与同一区域相邻。显然,对于只有两条边的节点,两条边共享两个区域(这就是我们在上一步中消除它们的原因)。对于具有三条边的节点,任意两条边至少共享一个区域

下面是如何枚举这些区域:为所有边和顶点指定一个序列号。为每条边指定一个方向,使其从编号较低的边延伸到编号较高的边。从顶点1(右侧)开始,并将该区域编号为1。跟踪此区域的边界边,将相同的数字1指定给其边界边的相应边。通过在每个节点上按逆周期顺序获取下一个相邻边来实现这一点。当回到起点时,您知道边界区域1的所有边

然后检查第一个顶点的左边缘。如果它不是区域1的一部分,那么它就是区域2,并且应用相同的算法。接下来,检查顶点2、右侧和左侧等。每次找到边和未编号的边时,指定下一个区域编号并跟踪新创建区域的边


确定哪个面积数对应于无穷大有一个小问题。要了解这一点,请使用一个简单的()图:两条边、两个节点和两个区域(内部和外部)。由于边和顶点的随机编号,外部可能最终为1或2。这是不可避免的;在图论中,内部和外部没有区别。

根据对我先前答案的评论:

这些图似乎都是无向的和平面的,也就是说,可以嵌入到一个二维平面中而不需要交叉边,并且给出了一个这样的嵌入。这种嵌入将分割平面。例如,图8将平面划分为三个区域:两个“内部”区域和一个无限外部区域。另一种观点是,节点的所有边都是循环排序的。(这是允许我们应用图论的基本部分)

分区必须由一个循环包围,但并非所有循环都可以将单个区域分区。然而,在图8的小例子中,所有三个区域都与一个不同的循环直接相关

输入图形通常可以简化。有些节点可能只有一条边;它们不能用于分区,可以与边缘一起删除。其他节点有两条边连接不同的节点。这里,节点和两条边可以替换为连接相邻节点的直接边。即,图8的图形可以简化为两个节点和它们之间的三条边。(这不是必要的步骤,但有助于计算)

现在,每个顶点的两边都有两个区域(因为它们是无向的,“左”和“右”没有明显的区别)。因此,对于<代码> v</COD>顶点,我们需要考虑<代码> 2×v v < /代码>边。它们通常不明显。如果两条相邻边(连接到同一节点)在该节点边的循环顺序中也是相邻的,则它们可以与同一区域相邻。显然,对于只有两条边的节点,两条边共享两个区域(这就是我们在上一步中消除它们的原因)。对于具有三条边的节点,任意两条边至少共享一个区域

下面是如何枚举这些区域:为所有边和顶点指定一个序列号。为每条边指定一个方向,使其从编号较低的边延伸到编号较高的边。从顶点1(右侧)开始,并将该区域编号为1。跟踪此区域的边界边,将相同的数字1指定给其边界边的相应边。通过在每个节点上按逆周期顺序获取下一个相邻边来实现这一点。当回到起点时,您知道边界区域1的所有边

然后检查第一个顶点的左边缘。如果它不是区域1的一部分,那么它就是区域2,并且应用相同的算法。接下来,检查顶点2、右侧和左侧等。每次找到边和未编号的边时,指定下一个区域编号并跟踪新创建区域的边

确定哪个区域编号对应有一个小问题