Untitled
unknown
c_cpp
2 years ago
1.9 kB
6
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;
}Editor is loading...
Leave a Comment