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

题目链接

  • 先分析一下之前思路的错误:
    题意转化可以得到,每删除一个点,那么总的边数至少减去二。之前想成了每个点至少有两条边,这是不对的。。。最简单的反例:三个点三条边删去两个点,只减少了两个边,显然是不对的
  • 分析:
    每个点被删去的时候,总变数至少减少二,那么每个点至少有两个属于它的边(认为每个边只属于一个点)。这样,点被删去的时候,总边数至少减去二(因为可能当前点连接着很多边,但是思维上我们认为是不属于这个点的),所以在构造的时候应该按照这个思路。
  • 接下来就说两种比较正常的思路:(构造中比较经常使用的方法)
    (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;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值