传送门
题目大意:
构造一个
n
个点的无向图,使这张图的直径与其补图的直径的最小值为
我们先证明一个结论:如果图
G
的直径大于
证明:
令
- 若
x
与
y 都在 P 中:如果x 与 y 都在S 中,那么在 G′ 中一定存在一条 x→v→y 的路径。在 T 中同理。否则如果一个在S 中,一个在 T 中,那么在G 中 x 与y 一定不相邻,在 G′ 中一定相邻。于是 x 与y 的距离小于 3 。 - 若
x 与 y 都在Q 中:如果 x 或y 就是 u ,那么在G′ 中 x 与y 一定相邻。否则 G′ 中一定存在一条 x→u→y 的路径。于是 x 与y 的距离小于 3 。 - 若
x 在 P 中,y 在 Q 中:如果x 在 S 中,那么在G′ 中一定存在一条 x→v→y 的路径。在 T 中同理。于是x 与 y 的距离小于3 。
这样就证完了。
显然
k=1
一定是无解的。于是我们只需构造
k
等于
当
显然如果连成一条链,
G′
的直径一定是
2
。判一下
当
k=3
时:
将前
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;
}