백준의 다리만들기2(17472) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 이번 글에서는 지난 글(다리만들기2 정답도출을 완전탐색으로 도출)에서 했던 방식과는 달리
MST(Minimum Spanning Tree)로 구하는 법을 알아보자.
사실, 지난 글과 코드의 대부분이 비슷하다. 정말 마지막 부분만 약간 다르기 때문에
이 글에서는 마지막 부분에 대해서만 설명을 할 것이다.
지난 번 글을 참고하고 싶다면 아래의 글을 읽으면 된다.
[ 백준(17472 ) - (1) ]
2) 정말 다 똑같은데, 마지막 부분에서 크루스칼 알고리즘을 이용해서 최소 스패닝 트리를 구하는 것으로 구현을 하였다.
아직 크루스칼 알고리즘을 잘 모른다면 아래의 글을 읽고 오자.
[ 크루스칼 알고리즘 알아보기 ]
정말 더 이상 설명할 말이 없다...
본인이 크루스칼 알고리즘으로 MST를 구현해서 문제를 풀 때 실수했던 부분은
"모든 섬들이 연결되는가" 부분을 체크해주지 않아서 fail을 여러번 받았다.
크루스칼 알고리즘 같은 경우, 하나의 섬이 연결이 되지 않더라도 따로 처리를 해주지 않으면 정답을 도출해 버리는
경우가 있었다.
위와 같은 맵이 존재할 때, 빨강색 동그라미 친 섬은 그 어떤 섬과도 연결될 수가 없다.
따라서, 위의 케이스의 정답은 -1이 맞다. 하지만 크루스칼에서 따로 처리를 해주지 않았더니 나머지 3개의 섬들간의
최소거리만 구하는 경우가 있어서 이 부분을 처리해 주었다.
처음에 처리하는 방식은, "1"번섬의 부모노드를 기준으로, 부모노드가 다른 어느 한 섬이라도 있으면 연결이 되지 않았다
고 표시를 해 주었는데 단순히 이러한 방식으로는 해결되지 못하는 부분이 있다.
본인은 먼저 합치는 경우(Union)에 무조건 더 작은 부모노드 번호를 따라 가도록 만들어 주었다.
예를 들어서 1번 노드의 부모노드가 1번, 2번 노드의 부모노드가 2번일 때, 2번노드의 부모노드가 더 작은 번호인
1번 노드로 바뀌도록 설정해 주었다. 이렇게 구현한다면 모든 섬들이 다 연결되었을 경우, 모든 섬들의 부모노드 번호가
1번이 되어 있을 것이다. 하지만, 1번 노드와 직접적으로 연결이 되지 않는 섬들 때문에 이러지 않은 경우가 존재한다.
아래의 예시를 한번 봐보도록 하자.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
| cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 17780 ] 새로운 게임 (C++) (9) | 2019.10.28 |
---|---|
[ 백준 17779 ] 게리멘더링2 (C++) (0) | 2019.10.23 |
[ 백준 17472 ] 다리만들기2 (C++) (1) (16) | 2019.09.24 |
[ 백준 17471 ] 게리멘더링 (C++) (6) | 2019.09.21 |
[ 백준 7453 ] 합이 0인 네 정수 (C++) (14) | 2019.09.17 |