발 간단한 경로의 수가 발견 알고리즘 에 에서


34

캔 누구도 날 입력으로서 취하는 시간 선형 알고리즘을 제안 비순환 방향 그래프 및 두 꼭지점 과 복귀에서 간단한 경로의 수 에 에서 . 나는 내가 DFS (깊이 우선 검색)을 실행하는 알고리즘을 가지고 있지만 DFS가 발견되면 다음 경로에 제공되는 노드의의 (회색 흰색에서) 색상을 변경하지 않습니다 그래서 이것이 다른 경로의 하위 경로 인 경우 DFS도이 하위 경로를 다시 통과합니다. 예를 들어 p 에서 v 까지의 경로 수를 찾아야하는 인접 목록을 고려하십시오 .G=(V,E)ststG
tstpv

poszorsvsrryyvvwzwz
여기서 DFS는 p 로 시작한 다음 v DFS가 정상적으로 실행되지 않기 때문에 p \ rightsquigarrow z로 간다고 말합니다. 경로는 psryv 가 발생하기 때문에 V 우리는 정점의 색상이 변경되지 않습니다 ,들 R, Y, V 경로 grey.Then에 POV 의 색상 때문에 V는 경로 white.Then 여전히 posryv 의 컬러 이후 의이 유사 흰색이며 경로 poryvpzvpsryvvs,r,y,vpovvposryvsporyv또한 v 가 발생 하면 증가하는 카운터가 유지 됩니다.

내 알고리즘이 맞습니까? 그렇지 않다면, 그것을 수정하기 위해 어떤 수정이 필요하거나 다른 접근법이 크게 감사하겠습니다.

참고 : 여기 에서는 노드에 상태에 따라 색상을 지정하는 " Comen의 알고리즘 소개" 책에 나와있는 DFS 알고리즘을 고려했습니다. 따라서 노드가 방문하지 않고 탐색되지 않은 경우 색상이 흰색으로 표시됩니다. 회색과 검은 색. 다른 모든 것은 표준입니다.



4
참고 모든 방향성 비순환 그래프의 경로가 반드시 (acyclicity 덕분에) 단순.
Noldorin

답변:


37

현재 구현은 DAG에서 올바른 수의 경로를 계산합니다. 그러나 경로를 표시하지 않으면 지수 시간이 걸립니다. 예를 들어, 아래 그림에서 DAG의 각 단계는 총 경로 수를 3의 배수로 증가시킵니다.이 지수 증가는 동적 프로그래밍으로 처리 할 수 ​​있습니다.

가리비

DAG 의 - 경로 수 계산은st

Paths(u)={1if u=t(u,v)EPaths(v)otherwise.

DFS를 간단히 수정하면 다음과 같이 계산됩니다.

def dfs(u, t):
    if u == t:
        return 1
    else:
        if not u.npaths:
            # assume sum returns 0 if u has no children
            u.npaths = sum(dfs(c, t) for c in u.children)
        return u.npaths

각 모서리가 한 번만 보이므로 의 런타임을 보는 것이 어렵지 않습니다 .O(V+E)


동일한 재귀 호출이 여러 번 호출되므로 알고리즘을 이해하면 동적 프로그래밍을 사용하여 조금 더 효율적으로 만들 수 있으므로 저장하는 것이 좋습니다.
Saurabh

1
@SaurabhHota, 그것은 동적 프로그래밍을 사용하고 있습니다. 정점 처음 발생되고, 그 경로의 수 계산 하는 . 이것은 u.npaths에 저장됩니다. 를 호출 할 때마다 경로 수를 재 계산하지 않고 단순히 u.npath를 반환합니다. utu
Nicholas Mancuso

1
이러한 그래프의 경우 대답은 m ^ n이 아니며 여기서 m은 열의 노드 수 (여기서는 3)이고 n은 s, t (여기서는 4)를 제외한 열의 수입니다. 예제 그래프의 경우 출력은 3 ^ 4 = 81입니다.
saadtaame

@saadtaame, 물론; 그러나 내 의도는 그래프의 "길이"가 증가함에 따라 단순히 지수 증가를 보여 주려는 것이 었습니다. 물론 고도로 구조화 된 그래프의 경우 나열된 알고리즘이 모든 그래프에서 작동하는 동안 닫힌 형태로 계산할 수 있습니다.
Nicholas Mancuso 2019

3
실행 시간은 일정한 시간에 필요한 추가 사항을 수행 할 수 있다고 가정하지만, 숫자는 할 수 있습니다 추가되는 최악의 경우 비트. 정확한 수의 경로 를 원하면 실행 시간 (카운팅 비트 연산)은 실제로 입니다. O(V+E)Θ(V)O(VE)
JeffE

15

한 노드에서 대상 노드까지의 경로 수는 하위 노드에서 대상까지의 경로 수의 합이라는 점만 알면됩니다. 그래프에주기가 없기 때문에이 알고리즘은 항상 중지됩니다.

이제 노드를 방문 할 때 한 노드에서 대상까지의 경로 수를 저장하면 정점 수에서 시간 복잡성이, 노드 수에서 메모리가 선형이됩니다.


0

DAG에서 두 정점 사이의 경로 수는 인접 행렬 표현을 사용하여 찾을 수 있습니다.

A가 G의 인접 행렬이라고 가정합니다. 항등 행렬을 추가 한 후 A의 K 제곱을 취하면 길이 <= K의 경로 수가 제공됩니다.

DAG에서 임의의 단순 경로의 최대 길이는 | V | -1이므로 | V | -1 번째 전력을 계산하면 모든 정점 쌍 사이에 경로 수가 제공됩니다.

TC 각각에 대해 log (| V | -1) 곱셈을 수행하여 | V | -1 전력을 계산할 수 있습니다. | V | ^ 2.


이 질문은 선형 시간 알고리즘을 요구합니다. 알고리즘이 그것보다 느립니다.
DW

@Vivek 당신은 당신의 대답에 정리에 대한 참조를 언급 할 수 있습니까?
Hamideh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.