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