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")



京公网安备 11010502036488号