记录下一开始写错的两道

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;
}
Problem E

相关文章: