Time Limit: 2000MS | Memory Limit: 262144KB | 64bit IO Format: %I64d & %I64u |
Description
A tree is a connected undirected graph consisting of n vertices and n - 1 edges. Vertices are numbered 1 through n.
Limak is a little polar bear and Radewoosh is his evil enemy. Limak once had a tree but Radewoosh stolen it. Bear is very sad now because he doesn't remember much about the tree — he can tell you only three values n, d and h:
The distance between two vertices of the tree is the number of edges on the simple path between them.
Help Limak to restore his tree. Check whether there exists a tree satisfying the given conditions. Find any such tree and print its edges in any order. It's also possible that Limak made a mistake and there is no suitable tree – in this case print "-1".
Input
The first line contains three integers n, d and h (2 ≤ n ≤ 100 000, 1 ≤ h ≤ d ≤ n - 1) — the number of vertices, diameter, and height after rooting in vertex 1, respectively.
Output
If there is no tree matching what Limak remembers, print the only line with "-1" (without the quotes).
Otherwise, describe any tree matching Limak's description. Print n - 1 lines, each with two space-separated integers – indices of vertices connected by an edge. If there are many valid trees, print any of them. You can print edges in any order.
Sample Input
5 3 2
1 2 1 3 3 4 3 5
8 5 2
-1
8 4 2
4 8 5 7 2 3 8 1 2 1 5 6 1 5
Source
VK Cup 2016 - Round 1 (Div. 2 Edition)
题意:一棵树有n个结点,n-1条边,如果以1为根,直径为d高度为h,现在边的信息不知道,随意输出一棵满足条件的树
思路:先输出组成高度的边,然后用高度补足直径,最后其他的点都连接在不相干的点,判断很多
1:2*h<d是不可以的,因为h肯定是d的一部分,d-h>h的话h就没意义了
2:d==2 h==1的时候直接把点全部连接在1
3:先以1为开始点,输出高度的边,每次记录上一个节点,这样方便输出,然后输出补全d的所有边,其他的点都连接在2上,但是前提是2是不相干的点,还有就是2,1,1这组数据也是可以的,加个特判
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int n,d,h; while(scanf("%d%d%d",&n,&d,&h)!=EOF) { if(d>n-1||h>n-1) printf("-1\n"); else if(h*2<d) printf("-1\n"); else if(h==1&&d==2) { int top=2; while(top<=n) { printf("1 %d\n",top++); } } else { int top=2,pre=1; if(d==1&&h==1) { if(n>2) { printf("-1\n"); continue; } } for(int i=1;i<=h;i++) { printf("%d %d\n",pre,top); pre=top; top++; } pre=1; for(int i=1;i<=d-h;i++) { printf("%d %d\n",pre,top); pre=top; top++; } while(top<=n) { printf("2 %d\n",top); top++; } } } return 0; }