2014-12-21 5 views
-1

그래프 G는 방향이없는 그래프이며 모든 에지의 가중치는 동일합니다. u, v는 주어진 2 개의 꼭지점이고, 그래프 G에서 u와 v 사이의 최단 경로 수를 찾는 방법은 O (| V |)입니까?무 방향성 그래프에서 두 정점 사이의 모든 최단 경로를 찾는 방법은 무엇입니까?

| V | G의 정점 수를 나타냅니다.

+0

나는 그것을 할 수 있다고 생각하지 않습니다. 'O (| V |)'는 너무 엄격합니다. BFS (나는 답의 기초라고 가정한다)는'O (| E | + | V |)'를 취하고 그래프를 제대로 읽으려면 O (| E | + | V |)가 필요하다. – amit

+0

[중복 가중치가없는 그래프에서 두 노드 간의 모든 최단 경로 찾기] (http://stackoverflow.com/questions/14144071/finding-all-the-shortest-paths-between-two-nodes-in-unweighted) -undirected-graph) – aerokite

+0

@AerofoilKite 연결된 질문에서 모든 최단 경로를 찾도록 요청했습니다. 이 사람은 단지 * 카운트를 요구합니다. 그것은 훨씬 쉬운 작업입니다. – amit

답변

4

BFS의 계수 변동을 사용할 수 있습니다.

아이디어는 dict:(v,depth)->#paths을 매핑하는 사전 (항목은 정점 및 현재 깊이이며 값은 소스에서 원하는 깊이의이 정점까지의 경로 수임)을 보유하는 것입니다.

BFS를 반복 할 때마다 경로의 현재 깊이를 추적하고 발견 된 경로 수를 다음 단계에 추가합니다.

당신이 x로 이어지는 3 개 경로와 깊이 3 y 모두로 이어지는 4 개 경로가 있고, 모두 가장자리 (x,u),(y,u)이있는 경우 있다는 생각 - 3 선도 + x에 대한 실행 (x - 다음 u에 이르는 7 개 경로가 , u)이고, 4는 y + (y, u)가됩니다.

그렇게 보일 것이다 :

findNumPaths(s,t): 
    dict = {} //empty dictionary 
    dict[(s,0)] = 1 //empty path 
    queue <- new Queue() 
    queue.add((s,0)) 
    lastDepth = -1 
    while (!queue.isEmpty()) 
     (v,depth) = queue.pop() 
     if depth > lastDepth && (t,lastDepth) is in dict: //found all shortest paths 
      break 
     for each edge (v,u): 
      if (u,depth+1) is not entry in dict: 
       dict[(u,depth+1)] = 0 
       queue.push((u,depth+1)) //add u with depth+1 only once, no need for more! 
      dict[(u,depth+1)] = dict[(u,depth+1)] + dict[v,depth] 

     lastDepth = depth 
    return dic[t] 

실행 시간은 사전에 대한 해시 테이블을 사용하는 경우 O (V + E)이다.


다른 용액 (프로그램 용이하지만 덜 효율적이)이다 작동

1. Build the adjacency matrix of the graph, let it be `A`. 
2. Set `Curr = I` (identity matrix) 
3. while Curr[s][t] != 0: 
    3.1. Calculate Curr = Curr * A //matrix multiplication 
4. Return Curr[s][t] 

이유 (A^n)[x][y]Ax에서 y에 나타내는 그래프의 크기 n의 경로의 수이다. 우리는 0보다 높은 첫 번째 숫자를 찾고 경로 수를 반환합니다.

+0

두 번째 솔루션은 영리하지만 런타임은 O (V + E) 일 수 없습니다. – Gary33

+0

@ Gary33 아니요, 두 번째 솔루션은 효율성이 떨어집니다. 그러나 Matlab에서 우아하고 멋지며 프로그램하기가 쉽기 때문에 추가하기로했습니다. 첫 번째 요구 사항은 복잡성 요구 사항을 충족해야하지만 프로그래밍하기가 조금 더 어렵습니다. – amit

+0

도움 주셔서 감사합니다! – Gary33

관련 문제