8
4

3 回答 3

7

您不是在寻找哈密顿循环(即开始 = 开始),而是寻找哈密顿路径,这也是一个 NP 完全问题。但是,您的图表不是通用的,因为只有 26 个字母。如果您允许超过 26 个字母的符号,那么它实际上等同于哈密顿寻路。

这是一个解决方案:您应该反过来思考:

  • 图的顶点是 26 个字母。
  • 对于每个以 x 开头并以 y 结尾的单词,字母 x 和 y 之间都有一条边

因此,您得到的实际上是一个多重图,因为多个单词可以以相同的字母开头和结尾。那么你正在寻找的东西被称为欧拉路径:它是一条每条边都恰好一次的路径。寻找欧拉路径是一个多项式问题(https://en.wikipedia.org/wiki/Eulerian_path)。它实际上可能是历史上第一个图形问题之一。

现在引用维基百科:

有向图有欧拉轨迹当且仅当至多一个顶点有 (out-degree) - (in-degree) = 1,至多一个顶点有 (in-degree) - (out-degree) = 1,每其他顶点具有相等的入度和出度,并且其所有具有非零度的顶点都属于底层无向图的单个连通分量。

与搜索哈密顿路径相比,这是确定是否存在路径的更好方法。

于 2013-07-17T17:22:31.820 回答
0

此处回答了类似的问题:Detecting when matrix multiplication is possible

您可以将其解决为欧拉路径问题,它比哈密顿路径简单得多。

不要让每个字符串成为图中的节点,而是让每个字母成为图中的节点。如果字符串从第一个字母开始并以另一个字母结束,则在两个字母之间添加有向边。现在在此图中找到一条欧拉路径将为您提供所需的解决方案。

于 2013-07-17T17:35:27.580 回答
0

假设您有一个大小为 26 的字母表。

让我们把你的单词想象成一个有向图,有 26 个顶点对应于所有字母 {a, b, ..., z}。

对于您拥有的每个单词,在图表中添加一条有向边——从单词的开头字母到结尾的字母。

然后你正在寻找这个图的欧拉路径 - 访问每条边的路径(通过你的每个单词)恰好一次。

有一个著名的定理:

n 个顶点上的有向图 G 有一个欧拉路径 iff。至少 n-1 个顶点的入度等于出度。

此外,还有一些算法可以在多项式时间内构建这样的游览,例如 Fleury 算法。

于 2013-07-17T17:36:46.180 回答