https://www.acmicpc.net/problem/1922
1922번: 네트워크 연결
이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.
www.acmicpc.net
풀이 과정
컴퓨터와 각 컴퓨터를 연결하는 비용을 줄 테니, 모든 컴퓨터를 연결 상태 (모든 컴퓨터 사이의 경로가 존재해야 함)로 만드는데 필요한 최소 비용을 구하는 문제이다.
컴퓨터와 컴퓨터를 연결하는 비용을 방향이 없는 가중치 그래프로 모델링 하면, 문제에서 요구하는 것은 그래프의 최소 신장 트리를 만들라는 것임을 알 수 있다.
최소 신장 트리를 만드는 방법은 크루스칼 알고리즘, 프림 알고리즘 2가지 방법이 있고, 크루스칼 알고리즘을 이용하여 문제를 해결하였다.
간선을 가중치를 기준으로 오름차순으로 정렬하고, 간선의 출발 지점과 도착 지점이 이미 연결되어 있지 않으면 최소 신장 트리에 속하는 간선으로 추가하는 방법이다. 이미 연결되어 있는지 아닌지는 유니온-파인드 알고리즘을 사용하여 판단하였다.
https://greentea31.tistory.com/117
백준 1717 - 집합의 표현 [C++]
https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주..
greentea31.tistory.com
유니온-파인드는 위의 문제를 풀고 공부하면 무엇인지 알 수 있다.
소스 코드
#include <bits/stdc++.h>
using namespace std;
int parent[1001];
int find(int x) {
if (parent[x] == x) {
return x;
} else {
return parent[x] = find(parent[x]);
}
}
void uni(int a, int b) {
int aRoot = parent[a];
int bRoot = parent[b];
if (aRoot == bRoot) return;
parent[aRoot] = bRoot;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, a, b, c;
int answer = 0;
cin >> N >> M;
tuple<int, int, int> edge[100005];
for (int i = 1; i < N+1; i++) {
parent[i] = i;
}
for (int i = 0; i < M; i++) {
cin >> a >> b >> c;
edge[i] = make_tuple(c, a, b);
}
sort(edge, edge+M);
for (int i = 0; i < M; i++) {
tie(c, a, b) = edge[i];
if (find(a) == find(b)) continue;
uni(a, b);
answer += c;
}
cout << answer;
return 0;
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1753 - 최단경로 [C++] (0) | 2022.07.13 |
---|---|
백준 1516 - 게임 개발 [C++] (0) | 2022.07.13 |
백준 2252 - 줄 세우기 [C++] (0) | 2022.07.12 |
백준 1717 - 집합의 표현 [C++] (0) | 2022.07.11 |
백준 1039 - 교환 [C++] (0) | 2022.07.11 |