Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找图中是否存在集合点_Algorithm_Graph_Graph Theory - Fatal编程技术网

Algorithm 查找图中是否存在集合点

Algorithm 查找图中是否存在集合点,algorithm,graph,graph-theory,Algorithm,Graph,Graph Theory,考虑一个通过铁路连接各个城市的图表。每个节点都是一个城市,有各种铁路线(边缘)到达另一个城市。您需要确定是否存在一个集合点,即一条这样的路线(即线路序列),无论从哪个城市出发,该路线始终到达同一个城市 例如。 考虑图G=[〔2, 1〕、〔2, 0〕、〔3, 1〕、〔1, 0〕〕。图的第k个元素(从0开始计数)将给出从站点k直接可到达的站点列表 出线编号为0、1、2。。。车站k列表的第r个元素给出了从车站k获取线路r可直接到达的车站的编号 然后我们可以选择路径[1,0]。也就是说,从起点站开始,走

考虑一个通过铁路连接各个城市的图表。每个节点都是一个城市,有各种铁路线(边缘)到达另一个城市。您需要确定是否存在一个集合点,即一条这样的路线(即线路序列),无论从哪个城市出发,该路线始终到达同一个城市

例如。 考虑图G=[〔2, 1〕、〔2, 0〕、〔3, 1〕、〔1, 0〕〕。图的第k个元素(从0开始计数)将给出从站点k直接可到达的站点列表

出线编号为0、1、2。。。车站k列表的第r个元素给出了从车站k获取线路r可直接到达的车站的编号

然后我们可以选择路径[1,0]。也就是说,从起点站开始,走第二个方向,然后是第一个方向。如果第一个方向是红线,第二个方向是绿线,你可以这样说: 如果你迷路了,走绿线1站,然后走红线1站。 因此,请考虑从每个

开始的方向。
0->1->2.

1->0->2.

2->1->2.

3->0->2.

因此,无论起点站在哪里,这条路都通向2号站

线路限值为0至5,车站限值为2至50。所以在最坏的情况下,可能会有2^(49*5)个路由子集,所以暴力是不可能的

编辑1: 在提到这个问题后,在DFAs中称之为同步序列

另外,我只对会议路径存在与否感兴趣。我发现(幻灯片5)指出

Adler and Weiss, 1970 (Conjecture)
Every finite strongly connected aperiodic directed graph of uniform outdegree has 
a synchronizing coloring.
或者

Every strongly connected graph with 'x' cycles all having gcd 1 (which states 
aperiodicity) has a meeting path.
这适用于大多数情况。然而,不难想出这样的办法:


这两者都不是强关联的,所以非周期性成为不可能。并且仍然有一个会议路径[0->1]。那么,我在这里遗漏了什么呢?

如果路径指示沿x出去,并且没有标记为x的传出链接,那么您不会说该怎么办,因此我将假设所有节点都有一组完整的传出链接,或者我们将此类遗漏的链接视为指向当前节点的链接,或者标记为0的链接的副本,或者其他内容

我从一组可能存在的节点开始,初始化为所有节点的集合

对于每个标签,获取可能的节点集,并计算从当前集中的任何节点(在当前标签之后)到另一个节点所得到的节点集。如果对于每个可能的标签,结果始终与当前可能节点集相同,则放弃。这意味着每个标签将当前集中的每个节点映射到不同的节点,并且,给定当前集中的任何节点和任何路径,无论其长度如何,您都可以在当前集中找到一个唯一的节点,该节点的路径以所选节点结束,因此这种情况在我看来毫无希望

如果对于某些标签,将此标签应用于当前集后的节点集小于当前集,请记下该标签,使新的较小集成为当前集,然后重复

如果此过程终止于一个大小为1的集合,则您已计算出一条以该节点为汇合点的路径,并且该路径不长于原始图形中的节点数,因为每一步都会将图形中的节点数减少至少一个。每个步骤最多花费图形中的边数,因此对于每个节点有N个节点和K个标签的图形,最多花费KN^2

事实上,由于每个阶段的检查相当于在当前集中查找至少一个具有两个相同标签的传入边的节点,然后删除当前集中没有具有所选标签的传入边的所有节点,我希望您可以使每一步的成本与丢弃的节点数成线性关系,并认为总成本低于O(KN^2)

(我很确定,我在某个地方看到了这一点,作为机器人导航的练习,或者其他一些东西,所以网络搜索可能比阅读这篇文章更可靠,但我写这篇文章很有趣,而且对我来说似乎是合理的)

编辑-


看来,这个问题被称为搜索有限自动机的同步序列。math.uni.wroc.pl/~kisiel/auto/Homing.pdf看起来很有希望,但我还没有详细讨论它。

正如我在评论麦克道拉的评论时所写的,我怀疑这个问题是NP完全问题。但是一个合理的启发可以让你在合理的时间内到达目标

以下想法基于一个*。将当前桩号集表示为节点(即,每个桩号集对应一个节点)。由于最多有50个站点,因此每个步骤都可以表示为64位数字(其中每个数字描述了相应的站点是否在集合中)

您希望维护一个打开节点的列表
O
,以及一个访问节点的列表
V
。从包含代表所有站点的单个节点的
C
O
开始

然后,该算法具有以下结构:

  • O
    中选择站点数最少的节点
    ->n
  • O
    中删除
    n
  • 每行
  • n
    转换为一组站
    nt
    ,这些站是使用指定线路从
    n
    中的站行驶而产生的(并计算站数以加快速度)
  • 如果
    nt
    只有一个站点,则表示您找到了一个集合点(可能不止一个)
  • 如果以前未访问过
    nt
    ,请将其添加到
    O
    V
    并将其路径设置为当前路径
  • 如果已经访问了
    nt
    ,您有两个选择。要么更新
    nt
    的路径以获得最小长度的路径,要么忽略它。