记录下一开始写错的两道水题
E:
先建出直径,然后在保证直径不变的情况下按照最大度数贪心就好了
注意一下一开始的特判
#include <bits/stdc++.h> using namespace std; #define X first #define Y second typedef pair<int,int> P; int n,d,k,tot;vector<P> res; void print() { puts("YES"); for(int i=0;i<res.size();i++) printf("%d %d\n",res[i].X,res[i].Y); } void dfs(int u,int v,int dist,int idx) { if(u) res.push_back(P(u,v)); if(tot==n) print(),exit(0); if(!dist) return; for(int i=1;i<=idx;i++) dfs(v,++tot,dist-1,k-1); } int main() { scanf("%d%d%d",&n,&d,&k); if(n<=d||n>2&&k<2) return puts("NO"); for(int i=1;i<=d;i++) res.push_back(P(i,i+1)); tot=d+1;if(tot==n) return print(),0; for(int i=2;i<=d;i++) if(tot<n&&k>2) dfs(0,i,min(i-1,d-i+1),k-2); puts("NO"); return 0; }