水啊2333,但是还是要练习的,毕竟有所收获.
深度和树的直径是有关系的,画图即可.(最长链是树上两个点的最远距离..)
1.先分配一个maxdep然后,假如最长链<深度-1直接-1,或者最长链>2*(深度-1).直接-1.
2.否则直接分配?先分配一个maxdep个点,然后在树的另一旁分配maxlian-(maxdep-1)-1个点,其他点全接在最后一个点上就没了2333
代码如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,d,h;//n个点,最长链为d,深度为h.
    scanf("%d%d%d",&n,&d,&h);
    if(d>2*(h)||d>=n||((n>=3)&&d==1))    {puts("-1");return 0;}
    for(int i=1;i<=h;i++)
    {
        printf("%d %d\n",i,i+1);
    }//分配了h+1个点.
    //if(h==d) return 0;
    if(h==d)
    {
        //if()
        for(int i=d+2;i<=n;i++)
        {
            printf("%d %d\n",d,i);
        }
    }
    else
    {
        for(int i=1;i<=d-h-1;i++)
        {
            if(i==1)
            {
                printf("1 %d\n",i+h+1);
            }
            else
            {
                printf("%d %d\n",i+h,i+h+1);
            }
        }//d
        if(h==d-1)
        {
            for(int i=d+1;i<=n;i++)
            {
                printf("%d %d\n",1,i);
            }
        }
        else
        {
            for(int i=d+1;i<=n;i++)
            {
                printf("%d %d\n",d,i);
            }
        }
    }
    return 0;
}

细节挺多的,注意一下~