[题目链接]
https://codeforces.com/problemset/problem/639/B
[算法]
当d > n - 1或h > n - 1时 , 无解
当2h < d时无解
当d = 1 , n不为2时 , 无解
否则 , 我们先构造一条长度为h的链 , 然后 , 将一条(d - h)的链接到根上 , 再将剩余节点接到根上
时间复杂度 : O(N)
[代码]
#include<bits/stdc++.h> using namespace std; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); } template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); } template <typename T> inline void read(T &x) { T f = 1; x = 0; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0'; x *= f; } int main() { int n , h , d; read(n); read(d); read(h); if (d > n - 1 || h > n - 1) { printf("-1 "); return 0; } if (h * 2 < d) { printf("-1 "); return 0; } if (d == 1 && n != 2) { printf("-1 "); return 0; } for (int i = 2; i <= h + 1; i++) printf("%d %d ",i,i - 1); for (int i = 1; i <= d - h; i++) { if (i == 1) printf("%d %d ",1,h + 1 + i); else printf("%d %d ",h + i,h + 1 + i); } if (d == h) { for (int i = d + 2; i <= n; i++) printf("%d %d ",2,i); } else { for (int i = d + 2; i <= n; i++) printf("%d %d ",1,i); } return 0; }