Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- #define ii pair<int,int>
- #define fi first
- #define sc second
- #define sqr(x) ((x)*(x))
- #define all(x) (x).begin(),(x).end()
- #define rank qwertyui
- const int N = 200005;
- int root[N], rank[N];
- int find(int i) {
- if (i == root[i]) return i;
- return root[i] = find(root[i]);
- }
- int join(int u, int v) {
- u = find(u); v = find(v);
- if (u == v) return false;
- if (rank[u] > rank[v]) swap(u, v);
- if (rank[u] == rank[v]) rank[v]++;
- root[u] = v;
- return true;
- }
- signed main() {
- #ifdef _DEBUG
- freopen("in" , "r", stdin );
- #endif
- ios::sync_with_stdio(0); cin.tie(0);
- int n, m, d;
- cin >> n >> m >> d;
- for (int i = 1; i <= n; i++) {
- root[i] = i;
- }
- set<int> s;
- vector<ii> e;
- for (int i = 1; i <= m; i++) {
- int u, v;
- cin >> u >> v;
- if (u > v) swap(u, v);
- if (u == 1) {
- s.insert(v);
- rank[v] = n;
- }
- else e.push_back(ii(u, v));
- }
- if (s.size() < d) {
- cout << "NO" << '\n';
- return 0;
- }
- vector<ii> r;
- for (auto i : e) {
- int u = find(i.fi), v = find(i.sc);
- if (!(s.count(u) && s.count(v))) {
- if (join(u, v)) r.push_back(ii(i.fi, i.sc));
- }
- }
- int t = s.size() - d;
- for (auto i : e) {
- if (!t) break;
- if (join(i.fi, i.sc)) {
- r.push_back(ii(i.fi, i.sc));
- t--;
- }
- }
- if (t) {
- cout << "NO" << '\n';
- return 0;
- }
- for (auto i : s) {
- if (join(1, i)) r.push_back(ii(1, i));
- }
- cout << "YES" << '\n';
- for (auto i : r) {
- cout << i.fi << ' ' << i.sc << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment