#P1200. 简单图启蒙

简单图启蒙

简单图启蒙

描述

马上就要高考了,小姜决定出一道简单的图论题作为 ACM 启蒙。

简单图上有一个非常简单的操作:

选择三个点 a,b,ca, b, c,要求操作之前,aabb 之间不存在边,aaccbbcc 之间都需要存在边。

在操作之后,aabb 之间新增一条边,aaccbbcc 之间的两条边消失。

容易发现,经过一次操作,一个图里面边的数量居然减少了!

于是,很自然的,小姜出了一道题:判断一个图是否能通过有限次操作,使得整个图里面所有点的度数都小于等于 11

可是,这道题居然被如下的随机算法卡过去了:

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 的结果是否一致
}

请帮帮小姜,构造一个数据,使得随机算法和正确算法得出的答案不一致。

由于评测机性能限制,而且有很多人疯狂提交,数据的点数请限制在 4040 以内,边数限制在 100100 以内。

作为一道启蒙题,不要求完全正确,只需要 10000rand_sim 里面,跑出来的结果和这个图实际上的解一致的次数小于 200,就能够 AC 此题。

输入数据

本题没有输入。

输出数据

第一行两个整数 n,mn, m,分别代表简单无向图的点和边数量。

接下来 mm 行,每行两个整数 u,vu, v,代表一条边。

$$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