Codeforces 658C Bear and Forgotten Tree 3【构造】

题目链接:

http://codeforces.com/contest/658/problem/C

题意:

给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边的端点,一种情况即可。如不存在,输出-1。规定根为1号结点。

分析:

首先可以明确 h<(d+1)/2 的时候不能构成树。
h!=d 时,先将 h1 个点和1连成串,然后剩下的点都和1直接相连。
h==d 时,还是先将 h1 个点和1连成串,剩下的点不能连在这个h个点构成的串的两头,在串中间随便找一点,然后剩下的点都和这个点连在一起就好了。
但是!前提是有这个随便的一点,也就是说h等于1的时候是没有中间节点的,除非只有两个结点,否则无法构成树。
h不等于1的情况就很简单了,直接在2上不停的加点就好了。。。

代码:

#include <cstdio>
int main (void)
{
    int n, d, h;
    scanf("%d%d%d", &n, &d, &h);
    if(h < (d + 1) / 2 ) return printf("-1\n"), 0;
    if(d == 1 && n > 2) return printf("-1\n"), 0;
    for(int i =  1 ; i <=  h; i++)
         printf("%d %d\n", i , i + 1);
    if (d != h){
        printf("1 %d\n", h + 2);
        for(int i = h + 2; i <= d; i++ )
            printf("%d %d\n", i , i + 1);
        for(int i = d + 2; i <= n ; i++)
               printf("1 %d\n", i);
    }else{
        for(int i = h+ 2; i <= n; i++)
            printf("2 %d\n", i);
    }

    return 0;
}

你可能感兴趣的:(Codeforces 658C Bear and Forgotten Tree 3【构造】)