The Generous BE-24 - The 2nd Meet
unknown
c_cpp
2 years ago
1.9 kB
10
Indexable
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class UnionFind {
vector<int> parent;
public:
int numSets;
UnionFind(int size) {
parent.resize(size);
for(int i = 0; i < size; i++) parent[i] = i;
numSets = size;
}
int findSet(int i) {
if(parent[i] == i) return i;
return parent[i] = findSet(parent[i]);
}
bool isSameSet(int i, int j) {
return findSet(i) == findSet(j);
}
void unionSet(int i, int j) {
int x = findSet(i), y = findSet(j);
if(x == y) return;
numSets--;
if(y < x) swap(x, y);
parent[y] = x;
}
};
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int V, E; cin >> V >> E;
UnionFind uf(V);
vector<pair<int, int>> bridges;
for(int i = 0; i < E; i++) {
int a, b; cin >> a >> b;
a--; b--;
if(b < a) swap(a, b);
bridges.push_back({a, b});
}
sort(bridges.begin(), bridges.end());
for(auto x : bridges) {
uf.unionSet(x.first, x.second);
}
int ans = 0;
vector<pair<int, int>> newBridges;
for(int i = 1; i < V; i++) {
if(!uf.isSameSet(0, i)) {
uf.unionSet(0, i);
ans += (i + 2);
newBridges.push_back({1, i + 1});
}
}
cout << newBridges.size() << ' ' << ans << '\n';
for(int i = 0; i < newBridges.size(); i++) {
if(newBridges[i].second > newBridges[i].first) swap(newBridges[i].first, newBridges[i].second);
}
sort(newBridges.begin(), newBridges.end(), greater<pair<int, int>>());
for(auto x : newBridges) {
cout << x.first << ' ' << x.second << '\n';
}
return 0;
}
Editor is loading...