[英]Given a directed weighted graph with self loops ,find the list of nodes that are exactly k dist from a given node x?
圖中的每個邊都具有1的權重。圖可以具有周期,如果節點具有自循環,則它可以是從0到無窮大的任何距離,具體取決於編號。 我們采取自我循環的時間。
我已經使用bfs解決了這個問題,但是對距離的約束是10 ^ 9的順序,因此bfs很慢。
我們將在形式(距離,源)的給定圖形上詢問多個查詢,並且o / p是從源頂點開始精確地在給定距離處的節點列表。
約束
1<=Nodes<=500
1<queries<=500
1<=distance<=10^9
我有一種感覺,會有很多重復的計算作為沒有。 節點很小,但我無法弄清楚如何在較小的問題中減少問題。
有效的方法是什么?
編輯:我已經嘗試過使用矩陣求冪,但對於給定的約束,它太慢了。 問題的時間限制為1秒。
設G = (V,E)
為圖形,並定義鄰接矩陣A
,如下所示:
A[i][j] = 1 (V[i],V[j]) is in E
0 otherwise
在這個矩陣中,對於每個k
:
(A^k)[i][j] > 0 if and only if there is a path from v[i] to v[j] of length exactly k.
這意味着通過創建此矩陣然后計算指數,您可以輕松獲得答案。
對於快速指數計算,您可以通過平方使用指數 ,這將產生O(M(n)^log(k))
,其中M(n)
是nXn矩陣的矩陣乘法的成本 。
在同一圖表上查找不同的查詢時,這也可以節省一些計算。
附錄 - 索賠證明:
基數: A^1 = A
,實際上在A
根據定義, A[i][j]=1
當且僅當(V[i],V[j])
在E
假設:假設聲明對所有l<k
都是正確的
A^k = A^(k-1)*A
根據歸納假設, A^(k-1)[i][j] > 0
如果存在從V[i]
到V[j]
的長度為k-1
的路徑。
讓我們檢查具有索引i
和j
兩個頂點v1,v2
。
如果它們之間存在長度為k
的路徑,則將其設為v1->...->u->v2
。 設u
的指數為m
。
從ih A^(k-1)[i][m] > 0
因為有一條路徑。 另外A[m][j] = 1
,因為(u,v2) = (V[m],V[j])
是邊。
A^k[i][j] = A^(k-1)*A[i][j] = A^(k-1)[i][1]A[1][j] + ... + A^(k-1)[i][m]A[m][j] + ... + A^(k-1)[i][n]A[n][j]
由於A[m][j] > 0
且A^(k-1)[i][m] > 0
,則A^(k-1)*A[i][j] > 0
如果沒有這樣的路徑,那么對於每個頂點u
使得(u,v2)是邊緣,沒有從v
到u
的長度k-1
路徑(其他的v1->..->u->v2
是長度為k
)的路徑。
然后,使用歸納假設我們知道如果A^(k-1)[i][m] > 0
則A[m][j] = 0
,對於所有m
。
如果我們在定義A^k[i][j]
的和中分配它,我們得到A^k[i][j] = 0
QED
小注釋:從技術上講, A^k[i][j]
是i
和j
之間的路徑數,長度恰好為k
。 這可以證明與上面類似,但更多地關注細節。
為了避免數字增長太快(這會增加M(n)
因為你可能需要大整數來存儲該值),並且因為你不關心0/1以外的值 - 你可以將矩陣視為布爾值 - 僅使用0/1值並修剪其他任何值。
如果圖表中有周期,那么您可以推斷cycle * N + 1
每個相鄰節點之間存在鏈接,因為您可以根據需要進行迭代。
這讓我想到了這個想法,我們可以利用這些循環來獲得優勢!
在檢測周期時使用BFS,我們計算offset + cycle*N
然后我們得到接近我們的目標(K)
很容易搜索K.
例如
A - > B - > C - > D - > BK = 1000; S = A;
A - 0
B - 1
C - 2
D - 3
B - 1(+ 4N)
在這里你可以檢查k - (1+4N) = 0
> 1000 - 1 - 4N = 0
> 999 = 4N
> N=249
=>最佳B是249*4 + 1
= 997
floor()
更簡單的方法是計算: round(k - offset, cycle)
從這里你可以只計算幾個步驟。
在這個例子中(作為REGEX): A(BCD){249}BCD
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.