【问题标题】:graph algorithm finding if graph is connected, bipartite, has cycle and is a tree图算法查找图是否连接,二分,有循环并且是一棵树
【发布时间】:2013-03-14 04:21:15
【问题描述】:

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

我想创建一些东西来获取图表的数据并检查它是否是: 1-连接 2- 双方 3-有循环 4- 是一棵树

所以我想知道,例如,是否可以将其编写为从执行上述测试的 .txt 文件中读取图形数据??

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

如果您能给我一个链接以阅读有关如何执行此任务或启动代码的链接,我们将不胜感激!

谢谢:D

【问题讨论】:

标签: algorithm function graph


【解决方案1】:

检查是否是:

  1. 已连接

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

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

如果只有一个组件,则图是连通的。

如果使用队列,算法是广度优先搜索。如果使用堆栈,则该算法是深度优先搜索。任何其他带有 push 和 pop-any 操作的集合都可以。特别感兴趣的是调用堆栈:将“遍历队列”替换为“递归遍历”

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

  1. 二分法

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

  1. 有循环

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

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

  • 当有一个入度为零的节点时
    • 将节点添加到拓扑排序(与检测循环无关)
    • 从图中删除节点
  • 如果图中还有节点
    • 图形包含有向循环。该图上不存在拓扑排序
  • 其他
    • 该图不包含有向循环(非循环)。生成的拓扑排序有效。

无向图是一棵树,当且仅当它是连通的且不包含环。

有向图是一棵有根树,当且仅当它没有无向环并且只有一个入度为零的顶点(只有一个根)。此外,有向图是一棵有根树,如果它是连通的,没有无向环,并且每个出度为零的节点的入度最多为 1(每个汇点都是叶子)。

【讨论】:

  • 感谢您提供的信息丰富的回复!我会接受这个并尝试从你的建议开始谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多