Untitled

 avatar
unknown
c_cpp
a year ago
1.9 kB
2
Indexable
#include <bits/stdc++.h>
using namespace std;

const int maxn = 5e4+10;

int U[maxn], V[maxn], W[maxn];
vector<int> adj[maxn], idx, cool;

bool baad[maxn];
int n, m;

struct DSU {
    vector<int> par, rnk, sz;
    int c;

    DSU(int n) : par(n+1), rnk(n + 1, 0), sz(n + 1, 1), c(n) {
        for(int i = 1; i <= n; i++) par[i] = i;
    }
    int find(int i) {
        return (par[i] == i? i : (par[i] = find(par[i])));
    }
    bool same(int i, int j) {
        return find(i) == find(j);
    }
    int merge(int i, int j) {
        if((i = find(i)) == (j = find(j))) return -1;
        if(rnk[i] > rnk[j]) swap(i, j);

        par[i] = j;
        sz[j] += sz[i];
        if(rnk[i] == rnk[j]) rnk[j]++;
        return j;
    }
};

int findMST(int e) {
    DSU D(n);

    int mst = 0;
    for(int i = 0; i < m; i++) {
        if(idx[i] == e) continue;
        int u = U[idx[i]], v = V[idx[i]];

        if(D.same(u, v)) continue;

        mst += W[idx[i]];
        D.merge(u, v);
    }

    for(int i = 1; i < n; i++)
        if(!D.same(i, i+1)) return 1e9+7;

    return mst;
}

int main()
{
    cin >> n >> m;

    DSU D(n);

    for(int i = 1; i <= m; i++) {
        cin >> U[i] >> V[i] >> W[i];

        adj[U[i]].push_back(V[i]);
        adj[V[i]].push_back(U[i]);
    }

    for(int i = 1; i <= m; i++) idx.push_back(i);

    sort(idx.begin(), idx.end(), [] (int a, int b) {return W[a] < W[b];});

    int mst = 0;
    for(int i = 0; i < m; i++) {
        int u = U[idx[i]], v = V[idx[i]];

        if(D.same(u, v)) continue;
        cool.push_back(idx[i]);

        mst += W[idx[i]];
        D.merge(u, v);
    }

    int ans = 0, cnt = 0;
    for(int i = 0; i < cool.size(); i++) {
        int M = findMST(cool[i]);

        if(M != mst) ans += W[cool[i]], cnt++;
    }

    cout << cnt << " " << ans << endl;

    return 0;
}
Leave a Comment