题目大意
给你点数n,以及限制
你要构造一个连通图G以及连通补图
使得min(G的直径,G′的直径)=k.
解题思路
k=1
k=1时显然无解。
k≥4
k>=4时也无解。
证明
我们用d表示
我们用d′表示G′中的距离。
假设d(u,v)≥4,证明∀x,y满足d′(x,y)≤2
由于d(u,v)≥4,则u,v,x,y在G中仅有该4点组成的子图中不连通。
那么就只有两种情况
- 第一种情况,x,y在G中无边,那么
d′(x,y)=1 - 第二种情况d′(x,y)≤d′(x,v)+d′(y,v)=2
得证。
k=2
当n≥5时有解。
构造方法就是G是一条由
这样
k=3
当n≥4时有解。
先连一条1到
参考代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define maxn 1005
using namespace std;
int n,k;
int main(){
scanf("%d%d",&n,&k);
if (k==1 || k>3) {
puts("-1");
return 0;
}
if (k==2) {
if (n<=4) {
puts("-1");
return 0;
}
printf("%d\n",n-1);
fo(i,1,n-1) printf("%d %d\n",i,i+1);
}
else {
if (n<=3) {
puts("-1");
return 0;
}
printf("%d\n",n-1);
fo(i,2,3) printf("%d %d\n",i-1,i);
fo(i,4,n) printf("3 %d\n",i);
}
return 0;
}