摘要: 题目的意思就是在直径上找一段距离不超过s的路径,使该路径的偏心距最小。 求出直径之后,显然我们可以用双指针扫描一段合法路径。设u1,u2...ut是直径上的点,d[ui]表示从ui出发能到达的最远距离(除直径),那么该路径的偏心距的表达式就是max(max{d[uk]},dist(u1,ui),di 阅读全文
posted @ 2022-07-18 22:58 YHXo 阅读(66) 评论(0) 推荐(0)
摘要: (这道题考察了求直径的两种方法......) 在原图中,每条边要经过两次,增加1条后,形成了一个环,那么环上的边只需要经过一次了(大量画图分析得),再增加一条又会形成一个环,如果这两个环有重叠,重叠部分还是要经过两次,就浪费了,所以我们先找直径(两次dfs),在直径的两个端点连一条边,就可以得到k= 阅读全文
posted @ 2022-07-18 21:37 YHXo 阅读(48) 评论(0) 推荐(0)
摘要: 求出最短树,用乘法原理统计答案就行了(模拟prim过程)。 不知道说什么了,直接上代码: 1 #include<cstring> 2 #include<iostream> 3 #include<algorithm> 4 #define ll long long 5 using namespace s 阅读全文
posted @ 2022-07-18 17:52 YHXo 阅读(38) 评论(0) 推荐(0)
摘要: 显然的0/1分数规划问题,用二分来解决,检验mid,就用prim算法求最小生成树,看总边权是否大等于0即可验证。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int M=1006; 4 const double eps=1e-8; 阅读全文
posted @ 2022-07-18 16:23 YHXo 阅读(24) 评论(0) 推荐(0)
摘要: 节点1是有度数限制的,把节点1去掉,就会形成若干个连通块,在每个连通块内部求最小生成树(prim算法实现),并求出每个连通块与1相连的最短的边,这样形成了初始状态的生成树。 假设(1,x)这条边没在生成树中,如果在生成树中从1到x的路径中的最大边权大于(1,x),考虑加上(1,x),去掉这条最大边权 阅读全文
posted @ 2022-07-18 11:50 YHXo 阅读(43) 评论(0) 推荐(0)
摘要: 完全图就是每两个点都有直接相连的边。 模拟Kruskal算法的过程,每选择一条边加入时,他两端端点在同一个集合中就跳过,否则考虑合并两个集合,合并时需要增加的每条边的权值至少是edge[i]+1,这才使得最小生成树不会改变,记录每个集合大小统计要增加的边数,累加答案。 1 #include <ios 阅读全文
posted @ 2022-07-18 09:17 YHXo 阅读(29) 评论(0) 推荐(0)