构造一个思维的树
题意:
有n个节点,其中有k个特殊节点,特殊的节点只能连接一条边,其它的至少两条边。问如何连接才能使得特殊节点的最远距离最短,输出一种方案。
思路:
可以看出连接时分层的,最外层只能是K个特殊节点,根据这样的性质可以直接得出最远距离,当(n-1)%k == 0的时候说明恰好有(n-1)/2层,其距离为乘以2,当有余数为1的时候∗2+1既可,其它的就是∗2+2 .画图可以很容易理解。对于连接方式:按层次输出即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
int n,k;
int Dist;
scanf("%d%d",&n,&k);
if((n-1)%k == 0)
Dist = (n-1)/k*2;
else if((n-1)%k == 1)
Dist = (n-1)/k*2 + 1;
else
Dist = (n-1)/k*2 + 2;
printf("%d\n",Dist);
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;
}