codeforces755E PolandBall and White-Red graph -- 构造

来源:互联网 发布:天刀女性捏脸数据下载 编辑:程序博客网 时间:2024/05/29 09:25

传送门

题目大意:

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

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

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

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

这样就证完了。

显然k=1一定是无解的。于是我们只需构造k等于23时的答案。
k=2时:
显然如果连成一条链,G的直径一定是2。判一下n=4时无解就可以了。
k=3时:
将前3个点依次连成一条链,后面的点都连向第3个点,那么GG的直径都是3

代码:

#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;}