1581B - Diameter of Graph

1581B - Diameter of Graph


题目:n,m,k分别表示n个点,m条边,图的直径<k-1;

图的直径为 两点之间最小的边数 的最大值。


题解:图的直径只有1,2 ,不存在的情况。

不存在的情况是:

n*(n-1)/2<m,边数大于最大边可存在的数。

m<n-1,不能连接每条边。

直径为2的情况:

n*(n-1)/2>m,这时候总会有 两点之间最小的边数 为2。

注:拿一个点做中转,剩下的点连接中转点。

直径为1的情况:

n*(n-1)/2=m,这时  两点之间最小的边数总是为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";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值