我有,我已表示爲Map<Node, Collection<Node>>
(在Java中發言,或f(Node n) -> Collection[Node]
作爲函數依賴圖的可達性;這是從一個給定節點n
到節點的集合依賴的映射在n
)。該圖可能是循環*。圖算法:從鄰接地圖
給定一個列表中的節點的badlist
,我想解決reachability problem:即產生一Map<Node, Set<Node>> badmap
表示從每個節點N的列表badlist
到一組節點,其中包括N或其他節點的是傳遞地依賴於映射它。
實施例:
(x -> y means node y depends on node x)
n1 -> n2
n2 -> n3
n3 -> n1
n3 -> n5
n4 -> n2
n4 -> n5
n6 -> n1
n7 -> n1
這可以被表示爲鄰接地圖{n1: [n2], n2: [n3], n3: [n1, n5], n4: [n2, n5], n6: [n1], n7: [n1]}
。
如果badlist = [n4, n5, n1]
那麼我期望得到badmap = {n4: [n4, n2, n3, n1, n5], n5: [n5], n1: [n1, n2, n3, n5]}
。
我在網上發現圖算法參考,所以如果任何人都可以指出我有效的可達性算法描述,我會很感激。 (某事的一個例子是不對我很有幫助,是http://www.cs.fit.edu/~wds/classes/cse5081/reach/reach.html,因爲該算法是確定一個特定的節點A是否是從一個特定節點B可到達)
*循環:如果你好奇,這是因爲它代表C/C++類型,並且結構可以具有指向正在討論的結構的成員。
好的,這很簡單。出於某種原因,我掛斷了一個事實,即必須重新執行'for root in badlist'循環,而沒有利用以前執行循環所獲得的知識。所以也許可以優化速度......但是你擁有的很簡單。 –
@Jason這對於有界的入度(即結構引用的不同結構類型的數量)的圖是漸近最優的。如果瓶頸不在其他地方,我會感到驚訝。 – quaint
@Jason:如果您想優化該算法的速度,請將標記位置於頂點本身,而不是在外部'visited'集合中查找它。 –