场上思路:发现存在两种特殊情况:边数最小的菊花树和边数最大的完全图。但由于理解错一般无向图直径的定义,不会处理介于菊花图与完全图之间的情况。此外,对于完全图直径为1和菊花图直径为2的性质理解的也不够深刻。
改进:对于题目定义的新概念要思考,同时要注意积累特殊情况的性质(异或和、菊花图等)。
#include<cstdio> #include<iostream> #define ll long long using namespace std; int main(){ int T; scanf("%d",&T); while(T--){ ll n,m,k; scanf("%lld%lld%lld",&n,&m,&k); //特殊情况判断 if(n==1){ if(m==0&&k>=2){ printf("YES\n"); continue; }else{ printf("NO\n"); continue; } } if(m<n-1||m>(n*(n-1))/2||k<=2){//严格小于k-1,即<=k-2,1<=k-2,k=3 //完全不可能满足条件(边数和直径要求) printf("NO\n"); continue; }else{ //恰好构成菊花图 if(m==n-1&&k>=4){//4-1=3>2 printf("YES\n"); continue; } //一部分完全,一部分为菊花图 else if(m>n-1&&m<(n*(n-1)/2)){//不完全菊花图 if(k>=4){ printf("YES\n"); continue; }else{ printf("NO\n"); continue; } } else if(m==(n*(n-1)/2)&&k>=3){//完全图 printf("YES\n"); continue; }else{ printf("NO\n"); continue; } } } return 0; }