#include<bits/stdc++.h> usingnamespace std; bool vis[1111]; int n, m; intmain() { cin >> n >> m; for (int i = 1; i <= m; i++) { int x; cin >> x; vis[x] = 1; } vector<int> ans; for (int i = 1; i <= n; i++) { if (vis[i] == 0) { ans.push_back(i); } } cout << ans.size() << '\n'; for (int i = 0; i < ans.size(); i++) { cout << ans[i] << ' '; } return0; }
#include<bits/stdc++.h> usingnamespace std; int fa[200005], n, m; bool can[200005]; // 这条边能不能作为连通块间的桥梁(好像反过来了) int edges[200005]; voidinit() { for (int i = 1; i <= n; i++) { fa[i] = i; } } intfind(int x) { if (fa[x] == x) { return x; } return fa[x] = find(fa[x]); } boolsame(int x, int y) { x = find(x); y = find(y); return x == y; } voidmerge(int x, int y) { x = find(x); y = find(y); fa[x] = y; } intmain() { cin >> n >> m; int ans = n - 1; init(); for (int i = 1; i <= m; i++) { int x, y; cin >> x >> y; edges[i] = x; if (!same(x, y)) { merge(x, y); can[i] = 1; ans--; } } cout << ans << '\n'; int cnt = 1; for (int i = 1; i <= m; i++) { if (can[i]) { continue; } while (same(cnt, edges[i]) && cnt <= n) { cnt++; } if (cnt > n) { return0; } merge(cnt, edges[i]); cout << i << ' ' << edges[i] << ' ' << cnt << '\n'; } return0; }