關于“ PHP邀請需求功能
”
的推薦:
-
確定哪些列表滿足需求的算法
這是一個圖問題,其中列表是節點之間的無向邊。例如:
[a, b, c]
表示從
a
到b
和c
,從b
到a
和c
,從c
到a
和b
有無向邊。當然,a
--b
,也意味著b
--a
。為了清楚起見,我重復了上面的邊緣。因此,您要做的是創建一個表示所有這些邊的鄰接列表,并應用回溯,因為您需要從源到目標的所有可能路徑。
下面是一些代碼,向您展示了這個想法:
adj_list = collections.defaultdict(set) for row in rows: for i, el in enumerate(row): for j in range(i+1, len(row): adj_list[el].add(row[j]) adj_list[row[j]].add(el) def backtrack(node, adj_list, seen, partial_res, res): if node == target: res.append(partial_res[:]) for neighbor in adj_list[node]: if neighbor in seen: continue seen.add(neighbor) partial_res.append(neighbor) backtrack(neighbor, adj_list, seen, partial_res, res) partial_res.pop() seen.remove(neighbor) res = [] backtrack(start, adj_list, set(), [], res) print(res)
我沒有運行這個。但是代碼應該給出回溯是如何工作的。這是一個dfs,您可以檢查每一條可能的路徑,并跟蹤所走過的邊。如果它指向目的地,則在最終結果中保存它的副本。
請注意,此算法在每個路徑中只訪問每個節點一次。
這里已經是底線啦~