codeforces755E PolandBall and White-Red graph -- 构造

传送门
题目大意:

构造一个 n 个点的无向图,使这张图的直径与其补图的直径的最小值为k,其中图的直径表示图中所有点对间最短路径的最大值。

我们先证明一个结论:如果图 G 的直径大于3,那么它的补图 G 的直径一定小于 3

证明:
       设图 G(V,E) 的直径为 (u,v) S 表示与u相邻的点的集合, T 表示与v相邻的点的集合。由于图的直径大于 3 ,所以S中的点与 T 中的点一定不相邻。
P=ST Q=VP 。然后我们对 G 中的点对 (x,y) 分类讨论:

  • x y都在 P 中:如果x y 都在S中,那么在 G 中一定存在一条 xvy 的路径。在 T 中同理。否则如果一个在S中,一个在 T 中,那么在G x y一定不相邻,在 G 中一定相邻。于是 x y的距离小于 3
  • x y 都在Q中:如果 x y就是 u ,那么在G x y一定相邻。否则 G 中一定存在一条 xuy 的路径。于是 x y的距离小于 3
  • x P 中,y Q 中:如果x S 中,那么在G中一定存在一条 xvy 的路径。在 T 中同理。于是x y 的距离小于3

这样就证完了。

显然 k=1 一定是无解的。于是我们只需构造 k 等于2 3 时的答案。
k=2时:
显然如果连成一条链, G 的直径一定是 2 。判一下n=4时无解就可以了。
k=3 时:
将前 3 个点依次连成一条链,后面的点都连向第3个点,那么 G G的直径都是 3 <script type="math/tex" id="MathJax-Element-25704">3</script>。

代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int i,j,k,n,m,p;
int main(){
    scanf("%d%d",&n,&k);
    if(n<4||k==1||k>3){
        puts("-1");
        return 0;
    }
    if(k==3){
        printf("%d\n",n-1);
        printf("1 2\n2 3\n");
        for(i=4;i<=n;i++)printf("%d %d\n",3,i); 
        return 0;
    }
    if(n==4)puts("-1");else{
        printf("%d\n",n-1);
        for(i=2;i<=n;i++)printf("%d %d\n",i-1,i);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值