DAG가 주어지면 전이 감소 를 찾기위한 O (V + E) 알고리즘을 찾고 있습니다.
즉, 임의의 v 및 u에 대해 u에서 v에 도달 할 수 있으면 모서리를 제거한 후에도 여전히 도달 할 수 있도록 가능한 많은 모서리를 제거합니다.
이것이 표준 문제인 경우 모델 솔루션을 알려주십시오.
DAG가 주어지면 전이 감소 를 찾기위한 O (V + E) 알고리즘을 찾고 있습니다.
즉, 임의의 v 및 u에 대해 u에서 v에 도달 할 수 있으면 모서리를 제거한 후에도 여전히 도달 할 수 있도록 가능한 많은 모서리를 제거합니다.
이것이 표준 문제인 경우 모델 솔루션을 알려주십시오.
답변:
각 정점에서 DFS를 수행하면이 문제를 해결할 수 있습니다.
위의 전체적인 복잡성은 DFS ' 실행의 복잡성인데 , 이는 입니다.O ( N ( N + M ) )
렘마 : 모서리 V-> Y가 있고 Y도 V 의 간접적 인 후속 작업 인 경우 (예 : V-> W-> + Y) 모서리 V-> Y는 전 이적이며 전 이적 근의 일부가 아닙니다.
방법 : 각 정점의 전이 폐쇄를 추적하여 터미널에서 초기 정점까지 역 토폴로지 순서로 작업합니다. V의 간접 후계자 세트는 V의 직계 후계자의 전이 폐쇄의 결합입니다. V의 전이 폐쇄는 간접 후계자와 직계 후임의 결합입니다.
연산:
Initialise Visited as the empty set.
For each vertex V of G,
Invoke Visit(V).
Visit(V):
If V is not in Visited,
Add V to Visited,
Initialise Indirect as the empty set,
For each edge V -> W in G,
Invoke Visit(W),
Add Closure(W) to Indirect.
Set Closure(V) to Indirect.
For each edge V -> W in G,
Add W to Closure(V),
If W is in the set Indirect,
Delete the edge V -> W from G.
이것은 정점 세트 (예 : 비트 맵)를 추적하는 효율적인 방법이 있다고 가정하지만이 가정은 다른 O (V + E) 알고리즘에서도 이루어 졌다고 생각합니다 .
잠재적으로 유용한 부작용은 G의 각 정점의 전이 폐쇄를 찾는 것입니다.
동일한 문제를 해결했지만 정확히 동일하지는 않았지만 원래 연결된 정점이 여전히 연결되어 있고 새로운 연결이 이루어지지 않도록 축소 후 그래프에서 최소 가장자리를 요구했습니다. 분명한 것처럼, 감소 된 그래프를 찾는 것이 아니라 중복 에지가 몇 개나 있는지를 말하는 것입니다. 이 문제는 O (V + E)에서 해결할 수 있습니다. 설명 링크는 https://codeforces.com/blog/entry/56326 입니다. 그러나 실제로 그래프를 만들려면 O (N)보다 복잡도가 높습니다.