图形算法查找图形是否连接,二分,有周期并且是树

时间:2013-03-13 19:06:30

标签: algorithm function graph

当我尝试使用图表并为其编写一些代码但没有运气时,我遇到了一个问题:/ !!

我想创建一些能够获取图表数据的内容并检查它是否: 1-连接 2-二分 3-有循环 4-是一棵树

所以我想知道是否可以编写这个来读取.txt文件中的图形数据来进行上述测试?

使用简单的边缘列表格式是正确的方法吗?

如果您能给我一个链接,了解如何执行此任务或启动代码,我们将非常感谢您的帮助!

谢谢:D

1 个答案:

答案 0 :(得分:25)

  

检查是否:

     
      
  1. 连接
  2.   

对于这个,你尝试从一个点遍历整个图形,看看你是否成功。这里可以接受深度优先遍历和广度优先遍历。该算法将节点拆分为组件:

  • 将所有节点标记为未访问
  • 对于每个节点c,如果未访问此节点
    • 创建一组新的空节点,即当前组件
    • 将此节点排入队列以进行遍历
    • 虽然有任何节点t排队
      • 从队列中删除此节点
      • 将每个未访问的邻居标记为已打开并将其排入队列以进行遍历
      • 将此节点标记为已遍历
      • 将此节点添加到当前组件
    • 关闭当前组件,并将其添加到组件集

如果只有一个组件,则图表已连接。

如果使用队列,则算法是广度优先搜索。如果使用堆栈,则算法是深度优先搜索。使用push和pop-any操作的任何其他集合都可以。特别感兴趣的是call-stack:将“enqueue for traversal”替换为“traverse recursively”

对于有向图,有两个相关的概念:如果连接忽略所有边缘方向,则有向图是弱连接的。如果每个节点都可以从每个节点到达,则有向图是强连接的。为了测试强连接性,只需使用前向边缘检查每个节点是否可以从第一个节点到达,并且只使用向后边缘可以从第一个节点到达每个节点(第一个节点可以从每个节点到达)。

  
      
  1. 二分
  2.   

如果它是双重的,则图是二分的。尝试分配双色,如果失败,图表不是二分图。这可以合并到以前的算法中:每当您将节点标记为打开时,为其指定一种颜色,与分配给其邻居t的颜色相反。当t的邻居已经打开时,请检查其颜色。如果它的颜色与t的颜色相同,则没有双色。

  
      
  1. 有周期
  2.   

这个很简单:如果你观察到已经打开的任何节点,就会有一个循环。请注意,没有周期的每个图都是二分图。

在有向图中,这将检测是否存在无向循环。要检测定向循环的存在,请使用以下(拓扑排序)算法:

  • 虽然有一个零度为indegree的节点
    • 将节点添加到拓扑排序(与检测周期无关)
    • 从图表中删除节点
  • 如果图表中仍有任何节点
    • 图表包含有向循环。该图表上不存在拓扑排序
  • 否则
    • 图表不包含有向循环(非循环)。生成的拓扑排序有效。
  
      
  1.   

无向图是树,如果它已连接且不包含循环。

有向图是一个有根的树,如果它没有无向的周期,并且只有一个顶点的度为零(只有一个根)。此外,有向图是一个有根的树,如果它是连接的,没有无向循环,每个具有零度的节点具有至多一个的indegree(每个接收器都是一个叶子)。