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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值