当我尝试使用图表并为其编写一些代码但没有运气时,我遇到了一个问题:/ !!
我想创建一些能够获取图表数据的内容并检查它是否: 1-连接 2-二分 3-有循环 4-是一棵树
所以我想知道是否可以编写这个来读取.txt文件中的图形数据来进行上述测试?
使用简单的边缘列表格式是正确的方法吗?
如果您能给我一个链接,了解如何执行此任务或启动代码,我们将非常感谢您的帮助!
谢谢:D
答案 0 :(得分:25)
检查是否:
- 连接
醇>
对于这个,你尝试从一个点遍历整个图形,看看你是否成功。这里可以接受深度优先遍历和广度优先遍历。该算法将节点拆分为组件:
c
,如果未访问此节点
t
排队
如果只有一个组件,则图表已连接。
如果使用队列,则算法是广度优先搜索。如果使用堆栈,则算法是深度优先搜索。使用push和pop-any操作的任何其他集合都可以。特别感兴趣的是call-stack:将“enqueue for traversal”替换为“traverse recursively”
对于有向图,有两个相关的概念:如果连接忽略所有边缘方向,则有向图是弱连接的。如果每个节点都可以从每个节点到达,则有向图是强连接的。为了测试强连接性,只需使用前向边缘检查每个节点是否可以从第一个节点到达,并且只使用向后边缘可以从第一个节点到达每个节点(第一个节点可以从每个节点到达)。
- 二分
醇>
如果它是双重的,则图是二分的。尝试分配双色,如果失败,图表不是二分图。这可以合并到以前的算法中:每当您将节点标记为打开时,为其指定一种颜色,与分配给其邻居t
的颜色相反。当t
的邻居已经打开时,请检查其颜色。如果它的颜色与t
的颜色相同,则没有双色。
- 有周期
醇>
这个很简单:如果你观察到已经打开的任何节点,就会有一个循环。请注意,没有周期的每个图都是二分图。
在有向图中,这将检测是否存在无向循环。要检测定向循环的存在,请使用以下(拓扑排序)算法:
- 树
醇>
无向图是树,如果它已连接且不包含循环。
有向图是一个有根的树,如果它没有无向的周期,并且只有一个顶点的度为零(只有一个根)。此外,有向图是一个有根的树,如果它是连接的,没有无向循环,每个具有零度的节点具有至多一个的indegree(每个接收器都是一个叶子)。