문제
도미노는 재밌다. 도미노 블록을 일렬로 길게 늘어세운 뒤 블록 하나를 넘어뜨리면 그 블록이 넘어지며 다음 블록을 넘어뜨리는 일이 반복되어 일렬로 늘어선 블록들을 연쇄적으로 모두 쓰러뜨릴 수 있다. 그러나, 가끔씩 도미노가 다른 블록을 넘어뜨리지 못하게 배치되어 있다면, 우리는 다음 블록을 수동으로 넘어뜨려야 한다.
이제 각 도미노 블록의 배치가 주어졌을 때, 모든 블록을 넘어뜨리기 위해 손으로 넘어뜨려야 하는 블록 개수의 최솟값을 구하자.
입력
첫 번째 줄에 테스트 케이스의 개수가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 두 정수 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 |
댓글