Submission

Status:

[PPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Bestzu

Problemset: รัฐบาล

Language: cpp

Time: 0.004 second

Submitted On: 2026-03-13 21:31:19

#include<bits/stdc++.h>
using namespace std;

const int N = 110;
int parent[N];
int sz[N];
int n, m;
vector<int> ID[N][N];

void set_parent() {
    for(int i = 1; i <= n; i++) {
        parent[i] = i;
        sz[i] = 1;
    }
}

struct Edge {
    int w, u, v;
    bool operator<(const Edge &o) const {
        return w < o.w;
    }
};

int findhead(int u) {
    if(parent[u] == u) return u;
    return parent[u] = findhead(parent[u]);
}

void unite(int a, int b) {
    int heada = findhead(a);
    int headb = findhead(b);
    if(heada == headb) return;

    if(sz[heada] < sz[headb]) swap(heada, headb);

    sz[heada] += sz[headb];
    parent[headb] = heada;
}

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

    cin >> n >> m;
    vector<Edge> edge;
    for(int i = 1; i <= m; i++) {
        int u, v, w; cin >> u >> v >> w;
        edge.push_back({w, u, v});
        ID[u][v].push_back(i);
        ID[v][u].push_back(i);
    }
    set_parent();
    sort(edge.begin(), edge.end());

    int ans1 = 0;
    int cnt = 0;
    vector<int> used_edge_idx;
    for(int i = 0; i < m; i++) {
        int u, v, w;
        tie(u, v, w) = tie(edge[i].u, edge[i].v, edge[i].w);
        if(findhead(u) != findhead(v)) {
            ans1 += w;
            used_edge_idx.push_back(i);
            unite(u, v);
            cnt++;
        }
        if(cnt == n-1) break;
    }
    int ans2 = INT_MAX;
    for(auto skip_idx : used_edge_idx) {
        set_parent();
        cnt = 0;
        int cur = 0;
        for(int i = 0; i < m; i++) {
            if(i == skip_idx) continue;
            int u, v, w;
            tie(u, v, w) = tie(edge[i].u, edge[i].v, edge[i].w);
            if(findhead(u) != findhead(v)) {
                cur += w;
                unite(u, v);
                cnt++;
            }
            if(cnt == n-1) {
                ans2 = min(cur, ans2);
                break;
            }
        }
    }
    cout << ans1 << " " << ans2;
    return 0;
}