CF1581B Diameter of Graph 题解
Content
\(\textsf{CQXYM}\) 想要构造一个包含 \(n\) 个点和 \(m\) 条边的无向连通图,并且他希望这个图满足下列条件:
- 该图中不存在重边和自环。也就是说,一条边应该连接两个不同的顶点,且两个点之间最多只能连一条边。
- 该图的直径严格小于 \(k-1\)。
定义:
- 一个图中两个节点之间的距离是以这两个点为端点的路径经过的最小边数。
- 一个图的直径是任意两点之间距离的最大值。
\(\textsf{CQXYM}\) 想知道他能不能够造出这样一个图。由于他还忙于其他事情,于是就把这个任务交给了你。
数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 10^5\),\(1\leqslant n\leqslant 10^9\),\(0\leqslant m,k\leqslant 10^9\)。
Solution
非常牛的一道分类讨论题。
首先,任何一个图的直径最少是 \(0\)(当且仅当 \(n=1\) 时成立),因此有 \(k-1>0\Rightarrow k>1\)。因此只要 \(k\leqslant 1\),就一定不能构造出满足题目要求的图,排除掉这一类。
排除掉这一类,我们再来看 \(n=1\) 时的情况,此时,由于图不存在重边和自环,因此必须要满足 \(m=0\)。所以当 \(n=1\) 的时候只需要判断是否有 \(m=0\) 成立。
然后就到了关键的 \(n>1\) 这一部分了。众所周知,一个 \(n\) 个点的图要变成联通的,最少需要 \(n-1\) 条边(此时它是一棵树),而且要保证不存在重边和自环的话,由于每个点最多能向 \(n-1\) 个点连边,但是不难发现,这样算的话每条边会重复计算 \(2\) 次。因此,满足条件的 \(n\) 个点的图最多边数为 \(\frac {n(n-1)}2\)。因此可以首先排除 \(m\) 不在 \([n-1,\frac{n(n-1)}2]\) 这个区间内的情况,此时一定不能构造出满足题目要求的图。
然后我们再分成 \(m\in[n-1,\frac{n(n-1)}2)\) 和 \(m=\frac{n(n-1)}2\) 这两个部分来讨论。
首先,我们来看,这是 \(m=n-1\) 的时候能够构造出来的直径最短的图的例子。

这种一个点连向其他所有点的树,我们称之为菊花图。可以看到,菊花图的直径为 \(2\),而非完全图不能做到一个点可以仅通过一条边到达其他点,因此,当 \(m\in[n-1,\frac{n(n-1)}2)\) 时,直径最小是 \(2\)。对应可以算出 \(2<k-1\Rightarrow k>3\)。
而当 \(m=\frac{n(n-1)}2\) 的时候,此时图变成了完全图,可以做到一个点仅通过一条边到达其他点,因此其直径为 \(1\),对应可以算出 \(1<k-1\Rightarrow k>2\)。
对应情况分类讨论判断即可通过此题。
Code
namespace Solution {
iv Main() {
MT {
ll n, m, k;
read(n, m, k);
if(n == 1) {
if(!m && k >= 2) YES; //赛时由于这里没有写 k >= 2 惨遭暴毙
else NO;
}
else if(m < n - 1) NO;
else if(m >= n - 1 && m < n * (n - 1) / 2) {
if(k <= 3) NO;
else YES;
} else if(m == n * (n - 1) / 2) {
if(k <= 2) NO;
else YES;
} else NO;
}
return;
}
}
CF1581B Diameter of Graph 题解的更多相关文章
- 【HDOJ】1706 The diameter of graph
这么个简单的题目居然没有人题解.floyd中计算数目,同时注意重边. /* 1706 */ #include <iostream> #include <string> #inc ...
- POJ 1737 Connected Graph 题解(未完成)
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
- [Leetcode Week3]Clone Graph
Clone Graph题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/clone-graph/description/ Description Clon ...
- 【Lintcode】137.Clone Graph
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- CodeForces 715B Complete The Graph 特殊的dijkstra
Complete The Graph 题解: 比较特殊的dij的题目. dis[x][y] 代表的是用了x条特殊边, y点的距离是多少. 然后我们通过dij更新dis数组. 然后在跑的时候,把特殊边都 ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- ACM - 最短路 - CodeForces 295B Greg and Graph
CodeForces 295B Greg and Graph 题解 \(Floyd\) 算法是一种基于动态规划的算法,以此题为例介绍最短路算法中的 \(Floyd\) 算法. 我们考虑给定一个图,要找 ...
- [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径
相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
随机推荐
- form-create 3.0 版本发布,好用的Vue3版本动态表单生成组件
form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持2个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...
- spring boot(三)整合 redis
Spring boot 集成redis 为什么要用redis,它解决了什么问题? Redis 是一个高性能的key-value内存数据库.它支持常用的5种数据结构:String字符串.Hash哈希表. ...
- C/C++ Qt 给ListWidget增加右键菜单
在上一篇博文<C/C++ Qt ListWidget 列表框组件应用>中介绍了ListWidget组件的基本使用技巧,本次将给ListWidget组件增加一个右键菜单,当用户在ListWi ...
- Codeforces 464E The Classic Problem(主席树+最短路+哈希,神仙题)
题目链接 题意:给出一张 \(n\) 个点 \(m\) 条边的无向图,第 \(i\) 条边连接 \(u_i,v_i\),边权为 \(2^{w_i}\),求 \(s\) 到 \(t\) 的最短路. \( ...
- 洛谷 P7360 -「JZOI-1」红包(Min-Max 容斥+推式子)
洛谷题面传送门 hot tea. 首先注意到这个 \(\text{lcm}\) 特别棘手,并且这里的 \(k\) 大得离谱,我们也没办法直接枚举每个质因子的贡献来计算答案.不过考虑到如果我们把这里的 ...
- 洛谷 P5902 [IOI2009]salesman(dp)
题面传送门 题意: 有 \(n\) 个展销会,每个展销会给出它的时间 \(t_i\),举办展销会的位置 \(l_i\),和参加这个展销会你能得到的收益 \(m_i\). 你现在在位置 \(s\),你可 ...
- CF 585 E Present for Vitalik the Philatelist
CF 585 E Present for Vitalik the Philatelist 我们假设 $ f(x) $ 表示与 $ x $ 互质的数的个数,$ s(x) $ 为 gcd 为 $ x $ ...
- 洛谷 P3643 - [APIO2016]划艇(dp)
题面传送门 一道难度中等的 \(dp\)(虽然我没有想出来/kk). 首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转 ...
- R语言中的read.table()
参考资料:http://www.cnblogs.com/xianghang123/archive/2012/06/06/2538274.html read.table(file, header = F ...
- C语言 自定义函数按行读入文件2
再改进下上次的读入一行函数,利用zlib库的gzgtec函数读取文件,动态分配内存,最后没有多出空行. 1 #include <stdio.h> 2 #include <stdlib ...