반응형

https://www.acmicpc.net/problem/2463

 

2463번: 비용

첫 번째 줄에 정점의 수 N (1< ≤ N ≤ 100,000)과 간선의 수 M (1 ≤ M ≤ 100,000)이 빈칸을 사이에 두고 주어진다. 다음 M개의 각 줄에 간선 하나에 대한 정보를 나타내는 세 개의 양의 정수 x,y,w가 빈칸

www.acmicpc.net

#include <iostream>
#include <algorithm>

#define MX 100003

typedef long long ll;
using namespace std;

const int mod = 1e9;
ll N, M, unf[MX];
ll sum = 0, ans = 0;

struct Edge {
    int x, y, w;

    bool operator<(const Edge &b) const {
        return w > b.w;
    }
};

Edge edges[MX];


int Find(int x) {
    if (unf[x] < 0) return x;
    return unf[x] = Find(unf[x]);
}

ll Union(int a, int b) {
    ll ret = unf[a] * unf[b];
    if (unf[a] < unf[b]) {
        unf[a] += unf[b];
        unf[b] = a;
    } else {
        unf[b] += unf[a];
        unf[a] = b;
    }
    return ret;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M;

    for (int i = 0; i < N; i++) {
        unf[i] = -1;
    }

    for (int i = 0; i < M; i++) {
        int x, y, w;
        cin >> x >> y >> w;
        edges[i] = {x, y, w};
        sum += w;
    }

    sort(edges, edges + M);

    for (int i = 0; i < M; i++) {
        auto [x, y, w] = edges[i];
        x = Find(x);
        y = Find(y);

        if (x != y) {
            ans += sum * Union(x, y);
        }
        ans %= mod;
        sum -= w;
    }
    cout << ans << '\n';
    return 0;
}
반응형

+ Recent posts