我想要生成一个有向图,其中包含指定数量的周期及其各自的长度。例如,图表应包含:
2 cycles of the size 3 1 cycle of the size 5
这样的算法是否已经存在?如果没有,那么解决这个问题的方法是什么?详细说明,给出了以下参数:
我只发现了几种能够检测现有图形中的循环的算法(例如,Tarjan)。您是否认为可以使用周期检测算法来生成具有特定周期数量的图形?
答案 0 :(得分:2)
在某些情况下可能失败的贪婪算法需要进行同行评审。
请注意,如果我们有一个长度为k
的周期:
1 -> 2 -> 3 -> ... -> k -> 1
我们可以通过引入一个其他节点来创建另一个相同长度的循环:
1 -> 2 -> 3 -> ... -> k -> 1
k' -> 1 -> 2 -> ... -> k - 1 -> k'
或相同长度的循环 - 1:
1 -> 2 -> 3 -> ... -> k -> 1
k' -> 1 -> ... -> k - 2 -> k'
这可以通过始终引入一个新节点并将其连接到一个初始的,足够大的循环中的其他两个节点来永远持续下去。
所以,如果你能负担无限数量的节点,那就从你需要的最大周期开始吧。
如果必须使用固定数量的节点,我们应尽量减少用于构造请求周期的节点数。任何剩余的节点都可以轻松添加,因此它们不会形成任何循环。
再次从最大周期开始:
1 -> 2 -> ... -> k -> 1
通过不添加任何更多节点,我们可以从中获得以下内容:
k
篇2
个周期:2 -> 1, 3 -> 2, ... 1 -> k
。
k - 2
篇3
个周期:3 -> 1, 4 -> 2, ..., k -> k - 2
。
一般情况下,k - p + 1
长p
个周期。
这些都不会产生额外的周期。所以整个算法将是:
构建您最大的请求周期。
1.1。如果不止一个,则通过为每个添加一个新节点来构建更多。请注意,这会影响通过不添加任何新节点来构建较大周期的较小周期所描述的过程,因为您获得了一定大小的新周期。会有一些重叠,所以你不能简单地加倍解决方案的数量。据我所知,它只增加了1。
通过不添加任何新节点来构建较小的周期。
如果没有完成所需的周期:
3.1。如果剩下节点,请使用它们。
3.2。如果您没有剩余节点,请输出no solution
。
如果完成了建筑周期:
4.1。如果您还剩下节点,请将它们添加为某个链接列表,这样它们就不会打扰您。
4.2。如果没有节点,你就完成了。