我遇到了一个问题,当时我正试图与图形和写一些代码,但没有运气:/!啊!
我想创建一个可以获取图形数据并检查它是否:
1-连接
二分体
3个周期
4-是一棵树
例如,我想知道是否可以编写它来从一个将要进行上述测试的.txt文件中读取图形数据?是吗?
使用简单的边列表格式是正确的方法吗?
如果你能给我一个链接来阅读如何完成这项任务或启动一个代码,我将不胜感激!啊!
谢谢:D
最佳答案
检查是否:
有联系的
对于这个,您尝试从一个点遍历整个图形,看看是否成功。深度优先遍历和宽度优先遍历在这里都是可以接受的。此算法将节点拆分为以下组件:
将所有节点标记为未访问
对于每个节点c
,如果该节点未被访问
创建新的空节点集,即当前组件
将此节点排队进行遍历
当有任何节点排队时
从队列中删除此节点
将每个未访问的邻居标记为打开,并将其排队以便遍历
将此节点标记为已遍历
将此节点添加到当前组件
关闭当前组件,并将其添加到组件集
如果只有一个组件,则图是连接的。
如果使用队列,则算法是广度优先搜索。如果使用堆栈,则算法是深度优先搜索。任何其他带有推送和弹出操作的集合都可以。特别有趣的是调用堆栈:将“遍历的排队”替换为“递归遍历”
对于有向图,有两个相关概念:一个有向图是弱连通的,只要它是连通的,而忽略了所有边的方向。有向图是强连通的,只要每个节点都能从每个节点到达。要测试强连接性,只需检查每个节点是否可以从仅使用前向边的第一个节点到达,以及每个节点是否可以从仅使用后向边的第一个节点到达(第一个节点可以从每个节点到达)。
二部的
图是二部的,只要它是二色的。尝试指定一个双色,如果失败,则图不是双色的。这可以合并到前面的算法中:每当您将一个节点标记为打开时,为它指定一种颜色,与指定给它的邻居的颜色相反。当t
的邻居已打开时,请检查其颜色。如果其颜色与t
相同,则不存在双色。
有循环
这个很简单:如果观察到任何已经打开的节点,都会有一个循环。注意,每个没有循环的图都是二部的。
在有向图中,这将检测无向循环的存在。要检测有向循环的存在,请使用以下(拓扑排序)算法:
当存在索引为零的节点时
将节点添加到拓扑排序(与检测循环无关)
从图中删除节点
如果图中还有任何节点
图包含有向循环。在该图上不存在拓扑排序。
其他的
图不包含有向循环(非循环)。生成的拓扑排序有效。
树
无向图是一棵树,只要它是连通的且不包含圈。
有向图是有根树,只要它没有无向圈并且只有一个顶点的索引为零(只有一个根)。此外,有向图是有根树,只要它是连通的,没有无向循环,并且每一个外度为零的节点最多有一个索引(每一个汇都是一片叶子)。