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