순환 그래프가 주어지면이 그래프를 비순환 부분 그래프로 분해하는 알고리즘을 찾고 있습니다. 각 서브 그래프에는 루트 정점이 있으며,이 정점은 최단 경로가 계산 된 소스입니다. 예를 들어,주기가 3,4 사이에 아래에 순환 적 그래프를 부여하고, 5순환 그래프를 최단 경로 부분 그래프의 최소 수로 분해하십시오.
가 +-------------------------+
| |
| |
+----------+----------+ |
v | v |
+---+ +---+ +---+ +---+ +---+ |
| 1 | --> | 3 | <--> | 4 | <--> | 5 | --> | 6 | |
+---+ +---+ +---+ +---+ +---+ |
^ |
| |
| |
+---+ |
| 2 | |
+---+ |
+---+ |
| 7 | <---------------------+
+---+
1에 대한 최단 경로 서브 그래프가 될 것이다 :
+---+ +---+ +---+ +---+
| 1 | --> | 3 | --> | 4 | --> | 7 |
+---+ +---+ +---+ +---+
|
|
v
+---+ +---+
| 5 | --> | 6 |
+---+ +---+
최단 경로 서브 그래프 (2)에 대한 것이다 :
는 +---+
| 7 |
+---+
^
|
|
+---+ +---+ +---+ +---+
| 2 | --> | 4 | --> | 5 | --> | 6 |
+---+ +---+ +---+ +---+
|
|
v
+---+
| 3 |
+---+
5에 대한 최단 경로 sugraph가 될 것이다 :
0,123,9023에 대한 최단 경로 하위 그래프는 1의 하위 집합이며 4는 2의 하위 집합입니다. 6 및 7은 잎이다.
현재 나의 (순진한) 해결책은주기를 막기 위해 방문한 노드에 플래그를 지정하여 각 노드에 대해 BFS를 수행하는 것입니다. 그런 다음 하위 그래프가 서로 다른 서브 그래프인지 확인하여 최소 수의 고유 한 하위 그래프를 만듭니다. 더 나은,보다 공식적인 솔루션에 대한 아이디어가 있습니까?
편집 제 상황의 그래프는 가중치가 적용되지 않지만 후계에 대한 일반적인 해결책이 좋습니다.
(http://bloodgate.com/graph-demo로 만든 그래프)
@ comestibles- 누군가가 가중치가 큰 그래프에서 APSP를위한 매우 빠른 알고리즘을 생각해 내 대답에 추가 한 논문을 찾았습니다. 또한, "subsumes"에 대한 정의가 반드시 정확하다고 생각하지 않기 때문에 약간의 알고리즘에 회의적입니다. v가 v의 BFS 트리가 U의 BFS 트리에 포함된다는 것을 의미하지는 않는다. 아니면 내가 잘못 생각한거야? – templatetypedef
@templatetypedef "분명히 u는 v_only if_ ...를 포함합니다." 즉, u에서 v까지의 경로가있을 수 있지만 v를 포함하지 않을 가능성이 있습니다. 오 탐율은 두 번째 단계에서 제거됩니다. 또한 연결된 종이는 시간을 절약하는 데 관한 것입니다. OP가 모든 BFS를 실행하려고한다면 시간이 문제가 아닌 것처럼 보이지만 OP만이 확실하게 알려줄 수 있습니다. – comestibles
@ comestibles- 아, 내 실수. 나는 그것을 잘못 읽었다. 이 것을 살펴보면 최악의 경우처럼 O (n (n + m)) = O (n^2 + nm)의 런타임을 제공하는 BFS의 다른 반복을 O (n) 이는 m = o (n log n) 인 그래프에서 반복 된 Dijkstra의 그래프보다 우수하고 m = o (n^2) 인 그래프의 경우 Floyd-Warshall보다 더 낫습니다. 아주 좋아! – templatetypedef