하자가 그래프, 그리고 다음 A
를 인접 행렬을 정의 G = (V,E)
이 매트릭스는
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.
이것은이 행렬을 생성하고 계산 수단에 의해 지수, 쉽게 답을 얻을 수 있습니다.
빠른 지수 계산을 위해 을 산출 할 수 있습니다. 여기서 M(n)
은 nXn 행렬에 대해 cost for matrix multiplication입니다.
동일한 그래프에서 다른 쿼리를 찾을 때 계산량을 절약 할 수 있습니다.
부록 - 주장의 증거 :
자료 : A^1 = A
, 실제로의 정의에 의해 A
, A[i][j]=1
(V[i],V[j])
이 E
가설에있는 경우에만 경우 : 주장을지지 모든 l<k
에 대한 올바른
A^k = A^(k-1)*A
. 유도 가설에서, k-1
길이가 V[i]
에서 V[j]
까지 인 A^(k-1)[i][j] > 0
iff 경로가 있습니다.
인덱스가 i
및 j
인 두 개의 정점 v1,v2
을 살펴 보겠습니다.
길이가 k
인 경우이를 v1->...->u->v2
으로합시다. u
의 색인을 m
으로합시다.
i.h에서.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)는 에지는, 길이 k-1
어떠한 경로로부터는 없다고 v
~ u
(기타 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
길이 정확히 k
의 j
사이의 경로의 수입니다. 위와 비슷하지만 세부 사항에 대해서는 조금 더주의를 기울여야합니다.
숫자가 너무 빠르게 증가하는 것을 피하려면 (그 값을 저장하기 위해 큰 정수가 필요할 수도 있으므로 M(n)
이 증가 할 것입니다.) 그리고 0/1 이외의 값을 신경 쓰지 않으므로 - 행렬을 불리언으로 처리 할 수 있습니다 - 0/1 값만 사용하고 다른 것은 다듬을 수 있습니다.
작은 k 및 큰 n의 경우 순진한 BFS 접근 방식이 더 저렴합니다. 그렇지 않으면, 이것이 갈 길입니다. –
당신의 접근 방식은 맞지만, 500x500 행렬에 대해 500 쿼리의 경우 전력 10^9에 비해 너무 느립니다. 원래 문제의 시간 제한은 1 초입니다. –
나는 당신의 접근 + [부울 행렬에 대한 더 빠른 곱셈] (https://en.wikipedia.org/wiki/Method_of_Four_Russians)으로 해결했습니다. –