mst 기본 문제
요즘에 너무 복붙만 해서 블로그 못 보면 문제를 못 풀 것 같았다.
그래서 아예 초심으로 돌아가서 그냥 백지에다 정리한 다음 풀었다.
암튼 문제를 풀기 전 백지에 두어번 적어보면서 풀었다는 걸 강조한다.
풀이는 간단하다.
- Edge 입력받기
- 가중치 기준으로 정렬한다
- 가중치가 작은 것부터 더해간다
시간 복잡도는?
- 정렬이 nlogn (eloge)
- edge 확인하면서 유니온파인드 find, merge -> 이것도 nlogn (elogv)
- e가 10만 이하라 시간복잡도 터지지 않는다
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
struct Edge {
int u, v, d;
};
int par[10005];
int find(int x) {
if (x == par[x])
return x;
return par[x] = find(par[x]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
par[x] = y;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
par[i] = i;
vector<Edge> edge(m);
for (int i = 0; i < m; i++)
scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].d);
sort(all(edge), [](const Edge &l, const Edge &r) {
return l.d < r.d;
});
i64 ans = 0;
for (auto e: edge) {
if (find(e.u) == find(e.v))
continue;
ans += e.d;
merge(e.u, e.v);
}
printf("%lld", ans);
return 0;
}
'백준' 카테고리의 다른 글
13905 세부 (0) | 2022.08.10 |
---|---|
1647 도시 분할 계획 (0) | 2022.08.09 |
9226 도깨비말 (0) | 2022.07.31 |
14615 Defend the CTP!!! (0) | 2022.07.30 |
24778 Cracking The Safe (0) | 2022.07.30 |