题目链接:
http://codeforces.com/contest/658/problem/C
题意:
给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边的端点,一种情况即可。如不存在,输出-1。规定根为1号结点。
分析:
首先可以明确
当
当
但是!前提是有这个随便的一点,也就是说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
"), 0;
if(d == 1 && n > 2) return printf("-1
"), 0;
for(int i = 1 ; i <= h; i++)
printf("%d %d
", i , i + 1);
if (d != h){
printf("1 %d
", h + 2);
for(int i = h + 2; i <= d; i++ )
printf("%d %d
", i , i + 1);
for(int i = d + 2; i <= n ; i++)
printf("1 %d
", i);
}else{
for(int i = h+ 2; i <= n; i++)
printf("2 %d
", i);
}
return 0;
}