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