[ 백준 1197 : 최소 스패닝 트리 ]
그래프를 준다.
그리고 각 간선에는 가중치가 주어진다. 방향성은 없다.
모든 노드를 연결하는 간선들 가중치의 합을 출력하면된다.
최소 스패닝 트리를 만드는 가장 쉬운 알고리즘을 소개한다.
크루스칼 알고리즘인데 구현하기가 매우 쉽고 빨라서 많이들 MST문제를 풀 때 크루스칼을 쓰는것같다.
알고리즘 구현 순서는
1. 간선의 정보를 입력받는다.
2. 오름차순으로 정렬을한다.
3. 작은 간선부터 차례대로 이어본다.
4. 만약 간선을 이었을때!!! 1-2-3-1-2-3-1-2-3 .. 이런식으로 반복되는. 싸이클을 도는 간선이라면 건너뛴다.
5. 간선을 N-1개를 연결했으면 지금까지 연결한 간선들이 최소 스패닝 트리가 된다.
진짜 쉽고 간단하다..
근데 제일 문제점은 간선을 이었을때 이게 싸이클을 도는지 안도는지를 확인하는 방법을 알아야한다.
유니온 파인드라는 방법을 많이 사용하는데
이런식이다.
1. 노드의 갯수만큼 배열을 선언한다.
2. 이 배열들은 모두 -1 같은 어떤 초기 값을 가지고 있는다. 이 초기값은 노드값이 될 수 없어야한다.
3. 1과 2 노드를 연결하는 간선을 만들어본다고하자.
그럼 ARRAY[1] = 1, ARRAY[2]=1 이런식으로 한 숫자를 바라보게한다.
다시 2와 3을 연결한다? 그럼 ARRAY[2] = 1는 이미 설정되어있다. ARRAY[3] = ARRAY[2] = 1 이렇게 재귀적으로 들어가 한 점을 바라보게 하면된다!!
그럼 이제 싸이클이 도는지 안도는지를 확인하는 방법은 ARRAY[X] != ARRAY[Y] 이면 아직 다른 컴포넌트임을 보여준다.
코드로 표현하면 더 쉽게 볼 수 있다.
아무튼 이 문제는
크루스칼 알고리즘 기초문제다.
가중치를 기준으로 오름차순 정렬을 한 후 가중치가 작은 간선부터
한개씩 연결하면된다!!
이 블로그 검색
피드 구독하기:
댓글 (Atom)
-
[ 백준 2528 : 사다리 ] 시뮬레이션문제 시뮬레이션이나 구현 문제의 차이점을 잘 모르겠다. 나는 시간이나 상황에따라 계속 변하는 것을 구현 하는것은 시뮬레이션이라 하고 딱 멈춰진 시간, 상황에 맞는 답을 구하는 것은 구현이라고 생각하...
-
[ 백준 1389 : 케빈 베이컨의 6단계 법칙 ] 한 지점을 기준으로 목표점에 얼마나 많은 간선을 지날 수 있는지를 묻는다. 그리고 그 수의 합이 가장 작은 기준 지점이 어떤 점인지를 묻는 문제이다. N이 100이다. 1을 기준으로 하고 ...
-
[ 백준 1806 : 부분합 ] 간만에 손도 풀고 감도 익힐겸 사이트에 들어갔는데 그냥 먼저 보이는 문제 하나 집어서 풀었다. 이 문제를 처음 읽고 메모이제이션해놓으면 편할것 같은데.. 생각하고 일단 바로 메모를 해놨다. DP라는 배열에 현재까...
[백준 16236] 아기 상어
[ 백준 16236 : 아기 상어 ] 2018 삼성전자 sw직무 하반기 기출문제입니다. 역대 삼성전자 기출문제가 그렇듯 역시나 BFS,DFS,완탐,DP,단순구현 입니다. 저는 문제를 단순히 BFS로 풀어갔습니다. 조건만 잘 지킨다면 한번에 ...
댓글 없음:
댓글 쓰기