题意:给出n个点,其中k个点只能有一条边相连,剩下的边至少有2条边相连,问构造出的树最远的两个点最近是多少
解答:度为1的点的数目越多,这个距离就越小。那么构造一个中心点,发散地连k个点。不够n的一层一层往最外面的点上面添加即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
int tmp = n - k - 1;
if(tmp > 0){
int ans = 1;
if(tmp % k == 0)
ans += (tmp / k);
else
ans += (tmp/k+1);
if(tmp % k == 1)
ans += (tmp/k+1);
else
ans *= 2;
printf("%d\n",ans);
}
else
printf("%d\n",2);
for(int i = 2;i <= k+1;i++)
printf("1 %d\n",i);
for(int i = k + 2;i <= n;i++)
printf("%d %d\n",i-k,i);
}
return 0;
}