水啊2333,但是还是要练习的,毕竟有所收获.
深度和树的直径是有关系的,画图即可.(最长链是树上两个点的最远距离..)
1.先分配一个maxdep然后,假如最长链<深度-1直接-1,或者最长链>2*(深度-1).直接-1.
2.否则直接分配?先分配一个maxdep个点,然后在树的另一旁分配maxlian-(maxdep-1)-1个点,其他点全接在最后一个点上就没了2333
代码如下:
#include <bits/stdc++.h> using namespace std; int main() { int n,d,h;//n个点,最长链为d,深度为h. scanf("%d%d%d",&n,&d,&h); if(d>2*(h)||d>=n||((n>=3)&&d==1)) {puts("-1");return 0;} for(int i=1;i<=h;i++) { printf("%d %d\n",i,i+1); }//分配了h+1个点. //if(h==d) return 0; if(h==d) { //if() for(int i=d+2;i<=n;i++) { printf("%d %d\n",d,i); } } else { for(int i=1;i<=d-h-1;i++) { if(i==1) { printf("1 %d\n",i+h+1); } else { printf("%d %d\n",i+h,i+h+1); } }//d if(h==d-1) { for(int i=d+1;i<=n;i++) { printf("%d %d\n",1,i); } } else { for(int i=d+1;i<=n;i++) { printf("%d %d\n",d,i); } } } return 0; }
细节挺多的,注意一下~