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见:算法与数 ...
随机推荐
- App 端自动化的最佳方案,完全解放双手!
1. 前言 大家好,我是安果! 之前写过一篇文章,文中提出了一种方案,可以实现每天自动给微信群群发新闻早报 如何利用 Python 爬虫实现给微信群发新闻早报?(详细) 但是对于很多人来说,首先编写一 ...
- docker 启动报错:Docker.Core.Backend.BackendException: Error response from daemon: open \\.\pipe\docker_e
win10 docker启动后报错: Docker.Core.Backend.BackendException:Error response from daemon: open \\.\pipe\do ...
- LOJ 2555 & 洛谷 P4602 [CTSC2018]混合果汁(二分+主席树)
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \ ...
- Codeforces 436E - Cardboard Box(贪心/反悔贪心/数据结构)
题面传送门 题意: 有 \(n\) 个关卡,第 \(i\) 个关卡玩到 \(1\) 颗星需要花 \(a_i\) 的时间,玩到 \(2\) 颗星需要 \(b_i\) 的时间.(\(a_i<b_i\ ...
- Codeforces Gym 101480C - Cow Confinement(扫描线+线段树)
题面传送门 题意: 有一个 \(10^6\times 10^6\) 的地图.其中 \(m\) 个位置上有花,\(f\) 个矩形外围用栅栏围了起来.保证 \(f\) 个矩形两两之间没有公共点. \(q\ ...
- Codeforces 1010F - Tree(分治 NTT+树剖)
Codeforces 题面传送门 & 洛谷题面传送门 神仙题. 首先我们考虑按照这题的套路,记 \(t_i\) 表示 \(i\) 上的果子数量减去其儿子果子数量之和,那么对于一个合法的放置果子 ...
- Codeforces 739D - Recover a functional graph(二分图匹配)
Codeforces 题面传送门 & 洛谷题面传送门 首先假设我们已经填好了所有问号处的值怎样判断是否存在一个合法的构造方案,显然对于一种方案能够构造出合法的基环内向森林当且仅当: \(\fo ...
- python10-高阶函数
def use_filer(l): """ 获取指定列表/元组中的奇数 :param l: lsit/tuple :return: """ ...
- 二叉树——根据遍历结果,画出对应的二叉树 转载至:http://canlynet.blog.163.com/blog/static/255013652009112602449178/
这道题目很经典,具体如下: 已知遍历结果如下,试画出对应的二叉树: 前序:A B C E H F I J D G K 中序:A H E C I F J B D K G 解题要点: 1.前序.中序.后序 ...
- matplotlib以对象方式绘制子图
matplotlib有两种绘图方式,一种是基于脚本的方式,另一种是面向对象的方式 面向脚本的方式类似于matlab,面向对象的方式使用起来更为简便 创建子图的方式也很简单 fig,ax = plt.s ...