문제 링크
- http://icpc.me/19336
사용 알고리즘
- Segment Tree
- SCC
풀이
SCC를 만들고, indegree가 0인 SCC마다 가중치가 가장 작은 것을 구해서 더해주면 됩니다. 근데 간선이 $O(N^2)$개인 것이 문제입니다.
세그먼트 트리를 이용해 그래프의 간선을 줄이는 테크닉을 이용하면 $O(N \log N)$개의 간선만으로 그래프를 만들 수 있고, 문제를 풀 수 있습니다.
indegree가 0인 SCC에서 가중치 최솟값을 구하는 것은 std::multiset을 써도 되고, 힙 2개를 이용해도 됩니다.
전체 코드
1 |
|