Untitled

 avatar
unknown
plain_text
17 days ago
1.5 kB
3
Indexable
int n, m;
 
struct edge
{
    int u, v, cost;
    bool operator<(const edge &other) const
    {
        return cost < other.cost;
    }
};
 
vii parent;
 
void make_set(int u)
{
    parent[u] = u;
}
 
int find_set(int v)
{
    return v == parent[v] ? v : parent[v] = find_set(parent[v]);
}
 
void union_set(int u, int v)
{
    u = find_set(u);
    v = find_set(v);
    if(u == v) return;
    parent[u] = v;
}
 
pair<int, vii> kruskal(int n, vector<edge> &e, sii &ex)
{
    parent.assign(n + 1, 0);
    FORD(i, 1, n)
    {
        make_set(i);
    }
    int total = 0, e_cnt = 0;
    vii mst;
    FOR(i, 0, e.size())
    {
        if(ex.count(i)) continue;
        if(find_set(e[i].u) != find_set(e[i].v))
        {
            union_set(e[i].u, e[i].v);
            total += e[i].cost;
            mst.pb(i);
            ++e_cnt;
        }
    }
    return (e_cnt == n - 1) ? make_pair(total, mst) : make_pair(INT_MAX, vii());
}
 
void nhap()
{
    cin >> n >> m;
}
 
void solve()
{
    nhap();
    vector<edge> e(m);
    FOR(i, 0, m)
    {
        cin >> e[i].u >> e[i].v >> e[i].cost;
    }
    sort(all(e));
    sii ex;
    pair<int, vii> res = kruskal(n, e, ex);
    int s1 = res.fi;
    vii mst = res.se;
    int s2 = INT_MAX;
    for(int i : mst)
    {
        ex.clear();
        ex.insert(i);
        int cost = kruskal(n, e, ex).fi;
        if(cost != INT_MAX)
        {
            s2 = min(s2, cost);
        }
    }
    cout << s1 << " " << s2;
}
Leave a Comment