본문 바로가기

백준

1197 최소 스패닝 트리

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