题目:n,m,k分别表示n个点,m条边,图的直径<k-1;
图的直径为 两点之间最小的边数 的最大值。
题解:图的直径只有1,2 ,不存在的情况。
不存在的情况是:
,边数大于最大边可存在的数。
,不能连接每条边。
直径为2的情况:
,这时候总会有 两点之间最小的边数 为2。
注:拿一个点做中转,剩下的点连接中转点。
直径为1的情况:
,这时 两点之间最小的边数总是为1。
#include<bits/stdc++.h>
#define ms(a) memset(a,0,sizeof(a));
typedef long long ll;
using namespace std;
const int N = 1e5 + 5;
bool solve() {
bool flag = 1;
ll n, m, k;
cin >> n >> m >> k;
ll sum = n * (n - 1) / 2;
if (n==1){
if (m == 0 && k - 1 > 0) {}
else flag = 0;
}
else {
if (m > sum || m < n - 1)flag = 0;//直径不存在
else if (m == sum) {//直径为1,但是不满足k
if (!(1 < k - 1))flag = 0;
}
else {//直径为2,但是不满足k
if (!(2 < k - 1))flag = 0;
}
}
return flag;
}
int main() {
int t;
cin >> t;
while (t--) {
if (solve())cout << "YES\n";
else cout << "NO\n";
}
}