A
vjudge
CF
题意:一个图,选择一个回答,\(k/2\) 的独立集或者不大于 \(k\) 的环。
考虑 \(k=n\) 如果是树直接黑白染色,否则必有环。
然后考虑出题人:“保证有解”,所以直接去一个 \(k\) 的联通块,按照 \(k=n\) 正常做即可……
水。
点击查看代码
#include <bits/stdc++.h>
#define dbg(x) cout << #x << '=' << x << endl
#define rep(i, l, r) for (int i = (l); i <= (r); i++)
#define frep(i, r, l) for (int i = (r); i >= (l); i--)
//#define int long long
using namespace std;const int N = 2e5 + 10;int n, m, k;
struct Edge {int u, v;
} ed[N];
vector<int> e[N];queue<int> q;bool vis[N];int newm;
vector<int> ee[N];vector<int> col[2];void Color(int u, int c, int f) {col[c].push_back(u);for (int v : ee[u]) {if (v == f) continue;Color(v, c ^ 1, u);}
}int top, sta[N], f[N];vector<int> ans;void Find(int u, int fa) {sta[++top] = u, f[u] = 1;for (int v : ee[u]) {if (v == fa) continue;if (f[v]) {ans.push_back(v);while (sta[top] != v) ans.push_back(sta[top--]);cout << 2 << "\n" << ans.size() << "\n";for (int x : ans) cout << x << " ";exit(0);}Find(v, u);}top--;
}void work()
{cin >> n >> m >> k;rep(i, 1, m) {int u, v; cin >> u >> v;ed[i] = {u, v};e[u].push_back(v);e[v].push_back(u);}int cnt = k - 1;vis[1] = 1;q.push(1);while (cnt) {int u = q.front(); q.pop();for (int v : e[u]) {if (!vis[v]) {vis[v] = 1, cnt--; q.push(v);if (cnt == 0) break;}}}rep(i, 1, m) {if (vis[ed[i].u] && vis[ed[i].v]) {newm++;ee[ed[i].u].push_back(ed[i].v);ee[ed[i].v].push_back(ed[i].u); }} if (newm == k - 1) {Color(1, 1, 0);int res = (k + 1) / 2;int ansc = 0;if (col[0].size() < res) ansc = 1;cout << 1 << "\n";rep(i, 0, res - 1) cout << col[ansc][i] << " ";return;}else Find(1, 0);
}int main()
{std::ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1, opinput = 0;if (opinput) cin >> T;while (T--) work();return 0;
}