题意:
就是让构造一个直径为d的树 每个结点的度数不能超过k
解析:
先构造出一条直径为d的树枝
然后去遍历这条树枝上的每个点 为每个点在不超过度数和直径的条件下添加子嗣即可
#include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; const int maxn = 10010, INF = 0x7fffffff; int n, d, k; int cnt; struct node { int u, v; node(int u, int v) { this->u = u; this->v = v; } }; vector<node> g; void dfs(int u, int D, int K) { if(D == 0) return; for(int i=1; i<=K && cnt < n+1; i++) { g.push_back(node(u, cnt++)); dfs(cnt-1, D-1, k-1); } } int main() { cin>> n >> d >> k; cnt = 0; if(n <= d || d > 1 && k < 2) return puts("NO"), 0; for(int i=1; i<=d; i++) g.push_back(node(i, i+1)); cnt = d + 2; for(int i=2; i<=d; i++) { dfs(i, min(i-1, d+1-i), k-2); } if(cnt <= n) return puts("NO"), 0; cout<< "YES" <<endl; for(int i=0; i<g.size(); i++) cout<< g[i].u << " " << g[i].v <<endl; return 0; }