题目大意
给你点数
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;
}