#P1200. 简单图启蒙
简单图启蒙
简单图启蒙
描述
马上就要高考了,小姜决定出一道简单的图论题作为 ACM 启蒙。
简单图上有一个非常简单的操作:
选择三个点 ,要求操作之前, 与 之间不存在边, 与 、 与 之间都需要存在边。
在操作之后, 和 之间新增一条边, 与 , 与 之间的两条边消失。
容易发现,经过一次操作,一个图里面边的数量居然减少了!
于是,很自然的,小姜出了一道题:判断一个图是否能通过有限次操作,使得整个图里面所有点的度数都小于等于 。
可是,这道题居然被如下的随机算法卡过去了:
bool rand_sim(Graph graph) {
bool std_ret = std_check(graph); // 使用正确算法得出的结果
int n = graph.n;
mt19937 rd(magic_num);
int time_lim = 50000; // 实际的 timelim 比这个高得多
while (time_lim--) {
int rd_id = (rd() % n) + 1;
if (graph.G[rd_id].size() < 2) continue; // 如果节点同时和至少两条边相连
vector<int> e;
for (auto to: graph.G[rd_id]) {
e.push_back(to);
}
int ne = e.size();
int rp1 = -1, rp2 = -1;
while (rp1 == rp2) {
rp1 = e[rd() % ne], rp2 = e[rd() % ne];
} // 随机选择两条边
if (graph.G[rp1].find(rp2) != graph.G[rp1].end()) continue;
// 如果操作之后的边已存在则跳过
// 模拟上文的操作
graph.erase(rp1, rd_id);
graph.erase(rp2, rd_id);
graph.insert(rp1, rp2);
}
bool sim_ret = graph.check(); // 检查当前图是否所有点的度数都小于等于1
return sim_ret == std_ret; // sim 和 std 的结果是否一致
}
请帮帮小姜,构造一个数据,使得随机算法和正确算法得出的答案不一致。
由于评测机性能限制,而且有很多人疯狂提交,数据的点数请限制在 以内,边数限制在 以内。
作为一道启蒙题,不要求完全正确,只需要 10000
轮 rand_sim
里面,跑出来的结果和这个图实际上的解一致的次数小于 200
,就能够 AC 此题。
输入数据
本题没有输入。
输出数据
第一行两个整数 ,分别代表简单无向图的点和边数量。
接下来 行,每行两个整数 ,代表一条边。
$$1 \leq n \leq 40, \quad 0 \leq m \leq \min \left\{100, \frac{n(n-1)}{2} \right\} $$样例输出
3 2
1 2
2 3