fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define all(v) v.begin(), v.end()
  6. #define memo(v, x) memset(v, x, sizeof(v))
  7. #define sz(v) (int)v.size()
  8.  
  9. void solve() {
  10. int n, m; cin >> n >> m;
  11. vector<vector<int>> adj(n);
  12. for (int i = 0; i < m; i++) {
  13. int u, v;
  14. cin >> u >> v;
  15. adj[u].push_back(v);
  16. adj[v].push_back(u);
  17. }
  18. vector<int> comp, vis(n);
  19. function<void(int)> dfs = [&](int node) {
  20. comp.push_back(node);
  21. vis[node] = 1;
  22. for (auto &child : adj[node]) {
  23. if (!vis[child]) {
  24. dfs(child);
  25. }
  26. }
  27. };
  28. vector<vector<int>> comps;
  29. for (int i = 0; i < n; i++) {
  30. if (!vis[i]) {
  31. comp = vector<int>();
  32. dfs(i);
  33. comps.push_back(comp);
  34. }
  35. }
  36. vector<array<int, 2>> ans;
  37. priority_queue<array<int, 2>> pq;
  38. for (int i = 0; i < sz(comps); i++) {
  39. pq.push({sz(comps[i]), i});
  40. }
  41. while (sz(pq) > 1) {
  42. auto [sza, ida] = pq.top();
  43. pq.pop();
  44. auto [szb, idb] = pq.top();
  45. pq.pop();
  46. ans.push_back({comps[ida].back(), comps[idb].back()});
  47. comps[ida].pop_back(), comps[idb].pop_back();
  48. sza--, szb--;
  49. if (sza) pq.push({sza, ida});
  50. if (szb) pq.push({szb, idb});
  51. }
  52. cout << sz(ans) << '\n';
  53. for (auto &[u, v] : ans) {
  54. cout << u << " " << v << '\n';
  55. }
  56. }
  57.  
  58. int32_t main() {
  59. cin.tie(0) -> sync_with_stdio(0);
  60. #ifndef ONLINE_JUDGE
  61. freopen("input.txt", "r", stdin);
  62. freopen("output.txt", "w", stdout);
  63. #endif
  64. int tc = 1;
  65. // cin >> tc;
  66. for (int t = 1; t <= tc; t++) {
  67. solve();
  68. }
  69. return 0;
  70. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
0