我有一个无向,未加权的图表。让我们修复一个顶点,找到覆盖该图顶点所有顶点的所有不同路径。任务是从每个顶点找到可能的这种路径的数量。
例如:让我们拍一张 4个顶点 <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="...">
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom">
的图表。 边是(1,2),(2,3),(3,4),(4,2)。 答案 4 。路径为[ 1, 2, 3, 4]
,1>2>3>4
,1>2>4>3
,3>4>2>1
。
我已经提出了一种算法,该算法使用强力技术来找到每个顶点初始化的可能的这种路径的数量。
例如:
对于上面的例子:
4>3>2>1
From vertex 1 there is 2 such path;
From vertex 2 there is no such path;
From vertex 3 there is 1 such path;
所以答案是 2 + 1 + 1 = 4 。
是否有可能以更好的时间复杂度解决此问题?
答案 0 :(得分:1)
通过修改Held--Karp DP获得了一个O(2 ^ n n ^ 2)时间算法。这个想法是,对于与S中的某个端点t配对的顶点的每个子集S,计算精确地访问S中的顶点并且通过求和在t处结束的路径的数量,对于在S中的t的每个邻居u,计数访问S - {t}并结束于你。作为一个基本案例,单例集都有计数1.在Python 3中:
import itertools
def count_hamilton_paths(graph): # graph is a dict of adjacency lists
vertices = frozenset(graph)
table = {(frozenset({t}), t): 1 for t in vertices}
for r in range(2, len(vertices) + 1):
for subset_tuple in itertools.combinations(vertices, r):
subset = frozenset(subset_tuple)
for t in subset:
subset_minus_t = subset - frozenset({t})
table[(subset, t)] = sum(table[(subset_minus_t, u)]
for u in graph[t]
if u in subset_minus_t)
return sum(table[(vertices, t)] for t in vertices)
print(count_hamilton_paths({1: {2}, 2: {1, 3, 4}, 3: {2, 4}, 4: {2, 3}}))