본문 바로가기

BOJ/C++

[BOJ] 9470. Strahler 순서 + TC

* 위상정렬을 이용

* 큐에서 방문하는 노드로 들어오는 가진 강의 순서가 가장 큰 값을 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