https://www.acmicpc.net/problem/1647
1647번: 도시 분할 계획
첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번
www.acmicpc.net
문제 풀이
이전에 풀었던 최소 스패닝 트리 문제랑 똑같이 풀었다큰 문제 풀이의 차이점이 없어 그냥 코드랑 링크만 첨부한다.https://itcodeheaven.tistory.com/73
[백준] 1197번 최소 스패닝 트리 C++ 문제풀이
문제 풀이 최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 의미한다. 최소 스패닝 트리를 만드는 방법에는 크게 Prim 알고리
itcodeheaven.tistory.com
소스 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<pair<int, pair<int, int>>> map;
int parent[100001] = { 0 };
int parent_find(int a) {
if (parent[a] == a)
return a;
else
return parent[a] = parent_find(parent[a]);
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
map.push_back(make_pair(c, make_pair(a, b)));
}
sort(map.begin(), map.end());
int result = 0;
int cnt = 0;
int idx = 0;
while (cnt < n - 2) {
int x = map[idx].second.first;
int y = map[idx].second.second;
int w = map[idx].first;
int p = parent_find(x);
int q = parent_find(y);
if (p != q) {
result += w;
parent[p] = q;
cnt++;
}
idx++;
}
cout << result << '\n';
}
'알고리즘' 카테고리의 다른 글
[백준] 2239번 스도쿠 C++ 문제풀이 (0) | 2024.01.19 |
---|---|
[백준] 12015번 가장 긴 증가하는 부분 수열 2 C++ 문제풀이 (1) | 2024.01.19 |
[백준] 11049번 행렬 곱셈 순서 C++ 문제풀이 (0) | 2024.01.16 |
[백준] 1197번 최소 스패닝 트리 C++ 문제풀이 (0) | 2024.01.12 |
[백준] 10942번 팰린드롬? C++ 문제풀이 (1) | 2024.01.12 |