C++ 随机数构造
#include <iostream> #include <random> #include <vector> using namespace std; struct Edge { int u, v, id; }; int main() { int t, n, m; cin >> t; while (t--) { cin >> n >> m; // 给每个点随机染色 遍历所有边 // 若核心边数 >= M/4 则输出 否则重新染色 vector<Edge> edges(m); for (int i=0; i<m; i++) { cin >> edges[i].u >> edges[i].v; edges[i].id = i+1; } // 随机生成n个0或1 random_device rd; mt19937 rng(rd()); uniform_int_distribution<int> dist(0,1); vector<int> color(n+1); // 从编号1开始 for (int i=0; i<10; i++) { // 最多随机10次 - 一定存在至少一个可能的解 for (int u=1; u<=n; u++) { color[u] = dist(rng); } vector<int> ans; for (auto& e : edges) { if (color[e.u]==0 && color[e.v]==1) { ans.push_back(e.id); } } // cout << ans.size() << endl; if (ans.size()>=m/4+1) { cout << ans.size() << endl; for (auto id : ans) { cout << id << ' '; } cout << endl; break; } } } } // 64 位输出请用 printf("%lld")