检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目描述
有个包含 个点, 条边,无自环和重边的无向图。
对于两个没有直接连边的点 ,你可以将它们合并。具体来说,你可以删除 及所有以它们作为端点的边,然后加入一个新点 ,将它与所有在原图中与 或 直接连边的点连边。
你需要判断是否能通过若干次合并操作使得原图成为一条链,如果能,你还需要求出这条链的最大长度。
#输入格式
第一行两个正整数 ,表示图的点数和边数。
接下来 行,每行两个正整数 ,表示 和 之间有一条无向边。
#输出格式
如果能通过若干次合并操作使得原图成为一条链,输出链的最大长度,否则输出$ -1 $
#输入输出样例
样例输入 #1
5 4
1 2
2 3
3 4
3 5
样例输出 #1
3
样例解释 #1
只要合并 和 就变成一条长度为 的链。
样例输入 #2
4 6
1 2
2 3
1 3
3 4
2 4
1 4
样例输出 #2
-1
#数据范围与约定
对于 的数据,;
对于 的数据,;
对于 的数据,,。
#思路
先考虑整张图连通的情况。
如果原图不是二分图则无解,因为对于一个长度大于 的奇环,如果合并环上任意两个不相邻的点,一定会生成一个更小的奇环,最后剩下一个无法继续合并的三元环,无法满足题目要求。
那么对于任意一个联通的二分图,可以钦定一个点 ,然后将所有与 距离相同的点合并。由于原图是二分图,所有与 联通的点必然在同一个点集中(两点间一定不会直接相连),这样就可以构造出一条最长链了。这条最长链的长度就是这个图的直径。
再考虑整张图有多个连通分量的情况。
对于每个连通分量都可以构造出一条链,然后再将这些链合并成一条长链即可,这条长链的长度为所有连通分量的直径之和。
#代码
1 |
|