考虑通过铁路连接各个城市的图表。每个节点都是一个拥有各种铁路线(边缘)到达另一个城市的城市。你需要找到一个会面点是否存在,即一条这样的路线(即线路的顺序),无论你从哪个城市开始,它总是到达同一个城市。
EG。 考虑图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)个路由子集,因此蛮力是不可能的。< / p>
Edit1:
mcdowella提到此问题后,Synchronising sequences in DFAs
Ans也是,我只对感兴趣,如果会议路径存在我发现this pdf(幻灯片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]。那我在这里错过了什么?
答案 0 :(得分:2)
如果路径表示沿着x出去并且没有标记为x的外向链接,那么你不会说要做什么,所以我假设所有节点都有一整套外向链接,或者我们对待这样的缺少链接作为返回当前节点的链接,或标记为0的链接的副本或其他内容。
我从一组可能存在的节点开始,初始化为所有节点的集合。
对于每个标签,取一组可能的节点,并计算从当前集合中任何节点到当前标签到另一个节点所获得的节点集。如果对于每个可能的标签,结果始终与当前可能节点集相同,请放弃。这意味着每个标签将当前集合中的每个节点映射到不同的节点,并且,给定当前集合中的任何节点和任何长度的任何路径,您可以在当前集合中找到具有以结尾的路径的唯一节点选择的节点,所以情况对我来说毫无希望。
对于某些标签,如果将此标签应用于当前集后的节点集小于当前集,请记下该标签,将新的较小集设为当前集,然后重复。
如果此过程以一组大小结束,那么您已经计算出以该节点结束的路径,并且该路径不会超过原始图中的节点数,因为每个步骤都会减少该数量图中的节点至少有一个。每个步骤最多花费您图表中的边数,因此对于具有N个节点和每个节点K个标签的图表,成本最多为KN ^ 2.
实际上,由于每个阶段的检查相当于在当前集合中查找至少一个节点,其中两个传入边缘具有相同的标签,然后删除当前集合中没有的所有节点使用所选标签的传入边缘,我希望您可以使每个步骤的成本在丢弃的节点数量上呈线性,并且认为总成本低于O(KN ^ 2)
(我很确定我已经看到这在某个地方适当地用作机器人导航中的练习或其他东西,所以网页搜索可能比读这个更可靠,但我写得很开心,它看起来很像对我来说是合理的。)
编辑 -
似乎该问题被称为搜索有限自动机的同步序列。 math.uni.wroc.pl/~kisiel/auto/Homing.pdf看起来非常有前景,但我没有详细介绍过。
答案 1 :(得分:1)
TL; DR :有O(n^2)
算法确定会议路径是否存在,如下所述:
考虑P(G)
,即原始图G
的功效图。通过获取原始图G
的节点集的所有子集,并将这些子集中的每一个设置为节点本身来创建功率图。边连接节点如下:
(使用G = [[2, 1], [2, 0], [3, 1], [1, 0]]
),并查看边缘1(或第1行,正如您的问题所述)
{0, 1, 2} -> {1, 0, 1} = {0, 1}
,因为在第1行时,0 -> 1
,2 -> 1
,1 -> 0
。
{0, 3} -> {1, 0}
,因为在第1行时,0 -> 1
和3 -> 0
。
等
现在,如果有n
个站,那么,如果{0, 1, ..., n-1}
中的节点P(G)
到{{1}中的单个(一个元素集)节点存在路径有一个会面点。因为,如果您将该路径作为一系列线路,则从任何一个站点开始将在同一站点中结束。现在,创建powerset当然非常昂贵(P(G)
),但是做一个重要的评论会导致计算量为O(2^n)
。
这句话与(Černý,1964)关于DFA的单词同步问题非常类似。这句话的证明草图最后是这个答案。这句话是在查看O(n^2)
:
当且仅当存在会议路径时,表示大小为2的子集的每个节点都有一个到单个节点的路径
也就是说,当我们创建G
时,我们只需要创建表示大小为2或更小的子集的节点。这意味着P(G)
只有P(G)
个节点。
所以,基本上算法是:
n^2
,P_2(G)
的功效图,其中每个节点代表大小为2或更小的子集。G
中大小为2的子集的每个节点:
如果此节点到单个节点没有路径,请返回P_2(G)
False
(只有在表示大小为2的子集的每个节点都有一个单例节点的路径时才会发生。)算法的第2部分可以使用DFS完成:您可以反转True
的所有边缘并开始与所有单例节点的DFS堆栈。然后,如果DFS树包含表示大小为2的子集的所有节点,则表示大小为2的子集的所有节点都具有到单个节点的路径。
第1部分是P_2(G)
,第2部分可以在O(n^2)
中通过反转图形的边缘并执行DFS来完成。
我希望这一点大部分都是清楚的。
该评论的证明:
我们首先处理方向,存在会议路径意味着,对于表示大小为2的子集的每个节点,存在到单个节点的路径。只需走会议路径。由于它是会议路径,因此从O(n^2)
中的任何节点开始都会在同一节点中结束。因此,采用会议路径将到达单个节点。
现在,如果对于表示大小为2的子集的每个节点,都有一个到单个节点的路径:那么,可以构建一个会议路径。使用表示大小为2的子集的两个不同节点,将它们命名为G
和A
。然后,将B
的路径转到单身人士。采用此路径A
和A -> {i}
,对于某些B -> C
和C
。然后,将{i}
的路径转到单身人士。 C
和{i} -> {j}
。然后,存在表示C -> {k}
的节点的会议路径。因此,我们可以找到{j, k}
和A
联合的会议路径。因此,我们可以为任何节点对执行此操作。归纳地,您可以找到表示大小为2的子集的任何节点集的并集的会议路径,因此可以这样做,直到整个节点集是起始点并且单个节点是结束。
答案 2 :(得分:0)
正如我在对mcdowella的评论的评论中所写,我怀疑这个问题是NP完全的。但合理的启发式方法可以让您在合理的时间内到达目标。
以下想法基于A *。您将当前的一组站表示为节点(即每个组对应一个节点)。由于您最多有50个站点,因此每个步骤都可以表示为64位数字(其中每个数字描述相应的站点是否在集合中)。
您希望维护列表O
的开放节点和列表V
访问过的节点。从C
开始,O
包含代表所有电台的单个节点。
该算法具有以下结构:
O
中节点数最少-> n
的节点。n
移除O
。n
转换为nt
中具有指定行的站点(并计算站点数量以加快速度)所产生的站点n
。“ / LI>
nt
有一个工作站,则您找到了一个会面点(可能不止一个)nt
,请将其添加到O
和V
,并将其路径设置为当前路径。nt
,则有两种选择。要么更新nt
的路径以获得最小长度的路径,要么忽略它。此图的大小是路径长度的指数。因此,该算法具有指数最坏情况的时间和空间复杂度。但是,由于您总是选择最少站点的节点,因此您需要采取一个步骤,将您带到最快路径上的目标。这可能是一个错误的步骤,这就是我们需要保留剩余图表的原因。您还将动态计算图形,这样可以避免将整个图形保留在内存中(除非没有解决方案)。