1. 程式人生 > >[Codeforces 639B] Bear and Forgotten Tree 3

[Codeforces 639B] Bear and Forgotten Tree 3

!= 鏈接 std read () ble typename oid pac

[題目鏈接]

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\n"); return
0; } if (h * 2 < d) { printf("-1\n"); return 0; } if (d == 1 && n != 2) { printf("-1\n"); return 0; } for (int i = 2; i <= h + 1; i++) printf("%d %d\n",i,i - 1); for (int i = 1; i <= d - h; i++) { if (i == 1) printf("%d %d\n",1,h + 1 + i); else printf("%d %d\n",h + i,h + 1 + i); } if (d == h) { for (int i = d + 2; i <= n; i++) printf("%d %d\n",2,i); } else { for (int i = d + 2; i <= n; i++) printf("%d %d\n",1,i); } return 0; }

[Codeforces 639B] Bear and Forgotten Tree 3