首先考虑两种特殊情况:
-
: 一棵
个节点的树,能取得的最大直径是
(此时树是一条链), 因此当
时,无解
-
, 考虑一棵
个节点的树能取得的最小直径:
-
当
时,最小直径为
,此时若
,无解。
-
当
时,最小直径为
,此时若
,把
这条边连起来就行了。
-
当
时,最小直径为
,除了根节点(假设根为编号为
的节点)以外,所有节点都与根节点直接相连,此时若
,无解。
-
其他都是有解的情况,构造方法如下:
-
先构造出直径
:连接
这些边,这样从
到
的距离为
,可以作为树的直径。
-
添加其他节点:对于其他节点,为了不干扰直径的长度,可以直接把这些节点和
这个节点相连,这样可以维持直径不变。
def solve(testcase):
n, k = MI()
if k == 1:
if n == 2:
print(1, 2)
else:
print(-1)
return
if n <= k:
print(-1)
else:
A = []
for i in range(1, k + 1):
A.append(f"{i} {i + 1}")
for i in range(k + 2, n + 1):
A.append(f"2 {i}")
print("\n".join(A))
for testcase in range(1):
solve(testcase)

京公网安备 11010502036488号