* 위상정렬을 이용
* 큐에서 방문하는 노드로 들어오는 가진 강의 순서가 가장 큰 값을 maxCost[] 에 저장한다. (이 값은 항상 최대값만 저장)
* cost[]에는 가장 큰 값을 maxx라고 가정한다면 maxx가 1번 들어오면 maxx값을 그대로 저장하고
2번이상 들어오면 maxx+1 을 저장한다.
* maxCost와 cost를 따로 두어야 한다. 같은 배열에 저장한다면 maxCost[] 의 값이 변경되면서 정답이 달라지기 때문이다.
간단하게 예를 든다면
3 | 4 |
2 | 4 |
1 | 4 |
이렇게 간선이 주어져있다고 가정하자.
1,2,3 번 노드는 강/호수 또는 바다와 인접한 노드이므로 1의 값을 가진다.
4번이 Strahler순서가 되는 값을 가질 텐데, indegree[4] = 3이다.
처음 1의 인접리스트를 통해 4에 접근할 것이다.
indegree[4] = 2
cost[4] = 1 (cost[1])
maxCost[4] =1 (cost[1])
2의 인접리스트를 통해 4에 접근
indegree[4] = 1
maxCost[4] == cost[2] (1) 이므로 cost[4] = 2 가 될것이다.
"가장 큰 값을 maxx라고 가정한다면 maxx가 1번 들어오면 maxx값을 그대로 저장하고
2번이상 들어오면 maxx+1 을 저장한다"
마지막으로 3의 인접리스트를 통해서 4에 접근
indegree[4] = 0
maxCost[4] = 1
cost[4] = 2
=> maxCost[4] 가 cost[3]과 같은 값(1)을 가진다. cost[4] = maxCost[4] + 1
정답은 2가 된다.
만약, maxCost 없이 현재 기준이 되는 노드가 가진 값들만 비교한다면 답은 3이 나온다.
+ TC (대회문제이기 때문에 공개된 TC가 존재한다.)
'BOJ > C++' 카테고리의 다른 글
[BOJ] 14391. 종이조각 (0) | 2020.04.16 |
---|---|
[BOJ] 1600. 말이 되고픈 원숭이 (0) | 2020.04.07 |
[BOJ] 1280. 나무심기 (0) | 2020.03.30 |
[BOJ] 2636. 치즈 (0) | 2020.03.29 |
[BOJ] 18808. 스티커 붙이기 (0) | 2020.03.25 |