Untitled
#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