본문 바로가기
알고리즘

[ 백준 4196 ] 도미노

by 데구르르르 2021. 3. 5.

문제

도미노는 재밌다. 도미노 블록을 일렬로 길게 늘어세운 뒤 블록 하나를 넘어뜨리면 그 블록이 넘어지며 다음 블록을 넘어뜨리는 일이 반복되어 일렬로 늘어선 블록들을 연쇄적으로 모두 쓰러뜨릴 수 있다. 그러나, 가끔씩 도미노가 다른 블록을 넘어뜨리지 못하게 배치되어 있다면, 우리는 다음 블록을 수동으로 넘어뜨려야 한다.

이제 각 도미노 블록의 배치가 주어졌을 때, 모든 블록을 넘어뜨리기 위해 손으로 넘어뜨려야 하는 블록 개수의 최솟값을 구하자.

입력

첫 번째 줄에 테스트 케이스의 개수가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 두 정수 N, M이 주어지며 두 수는 100,000을 넘지 않는다. N은 도미노의 개수를, M은 관계의 개수를 나타낸다. 도미노 블록의 번호는 1과 N 사이의 정수다. 다음 M개의 줄에는 각각 두 정수 x, y가 주어지는데, 이는 x번 블록이 넘어지면 y번 블록도 넘어짐을 뜻한다.


출력

각 테스트 케이스마다 한 줄에 정수 하나를 출력한다. 정답은 손으로 넘어뜨려야 하는 최소의 도미노 블록 개수이다.

예제 입력 예제 출력
1
3 2
1 2
2 3
1

 

풀이

강한 결합 요소 알고리즘 SCC 의  예시 문제이다.
먼저 강한 결합 요소 알고리즘을 활용하여 SCC 끼리 그룹을 만들어 주고,
이후 그룹 정점끼리 위상정렬을 하여 진입차수가 0인 SCC 그룹을 카운트 해서 리턴한다.

소스코드가 구려보여서, 나중에 한번 더 풀면서 줄여보도록 할 것!


[ JAVA ]

 

'알고리즘' 카테고리의 다른 글

[ 백준 14503 ] 로봇 청소기  (0) 2021.03.14
[ 프로그래머스 ] 땅따먹기  (0) 2021.03.09
[ 백준 2150 ] SCC  (0) 2021.03.04
[ 백준 1671 ] 상어의 저녁식사  (0) 2021.03.03
[ 백준 11376 ] 열혈강호2  (0) 2021.03.01

댓글