문제 링크
- http://icpc.me/4196
사용 알고리즘
- SCC
시간복잡도
- O(V + E)
풀이
x가 넘어지면 y도 넘어진다를 x->y간선으로 나타내서 방향 그래프를 만들어줍시다.
어떤 두 정점 u, v가 같은 SCC에 있다면, u 혹은 v 중 하나만 넘어져도 다른 것까지 같이 넘어지게 됩니다. 그러므로 SCC를 하나의 큰 정점(슈퍼 정점)으로 만들어서 다시 그래프를 만든다고 생각을 합시다. 당연히 DAG 형태가 나옵니다.
만약 어떤 슈퍼 정점 V의 in-degree가 0이 아니라면, 다른 SCC에 있는 어떤 도미노가 넘어지면서 V 안에 있는 모든 도미노도 넘어지게 됩니다. 그러므로 in-degree가 0이 아닌 슈퍼 정점은 손으로 넘어뜨릴 필요가 없습니다.
그러나 in-degree가 0이라면 한 개의 도미노를 손으로 넘어뜨려야 그 SCC에 있는 도미노가 모두 넘어지게 됩니다.
그러므로 in-degree가 0인 SCC의 개수 를 구해주면 됩니다.
전체 코드
1 |
|