Codeforces Round #236 (Div. 2)__Searching for Graph

来源:互联网 发布:http load windows 编辑:程序博客网 时间:2024/04/30 20:23

题目链接

  • 先分析一下之前思路的错误:
    题意转化可以得到,每删除一个点,那么总的边数至少减去二。之前想成了每个点至少有两条边,这是不对的。。。最简单的反例:三个点三条边删去两个点,只减少了两个边,显然是不对的
  • 分析:
    每个点被删去的时候,总变数至少减少二,那么每个点至少有两个属于它的边(认为每个边只属于一个点)。这样,点被删去的时候,总边数至少减去二(因为可能当前点连接着很多边,但是思维上我们认为是不属于这个点的),所以在构造的时候应该按照这个思路。
  • 接下来就说两种比较正常的思路:(构造中比较经常使用的方法)
    (1)构造比较平均的图,即点与点之间没有区别。代码可以参见这里
    1连接2,3;2连接3,4。。。。一直到2n条边,这个时候是一个正确的0-interestring图。之后只需要随意添加到足够的边即可
    (2)构造极端不平均的图,也就是尽可能多的使边集中在一个点上
    1先连接所有的点,然后是2,这个时候可以认为3之后的点都满足了,2只有一个边。既然1已经连接了所有的点,那么只有将有些边划归到1才能使1满足,1之后的所有点都可以这样操作,点2同理。我们继续按照不平均的策略来构造,对于点3,每连接一个点可以认为这个点多了一个边,又因为这个点一定和1,2连接,所以1或者2就可以多一个边。到此就可以构造出正确的0-interestring图。然后继续按照这个原则添加多余的边即可。

第二种构造法的解:思路麻烦,代码简单。。

int main(){//    freopen("in.txt", "r", stdin);    int kase;    RI(kase);    REP(tt, kase)    {        int npoint, p;        RII(npoint, p);        int cnt = npoint * 2 + p;        FE(i, 1, npoint) FE(j, i + 1, npoint)        {            if (cnt-- > 0)                cout << i << ' ' << j << endl;        }    }    return 0;}


10 0