.https://atcoder.jp/contests/arc116/tasks/arc116_e
学习自https://blog.youkuaiyun.com/RealKing_sblog/article/details/115359363
这题一眼就是二分答案转判定,然而不知道怎么得到最少的关键点数
g[u]表示从u开始到最远的没被已有的树占领的点的距离,f[u]表示已有的树跟到u的最小距离。
如果f[u]+g[u]<=mid,那么说明u这整棵子树都被下面的树的根给覆盖掉了,直接g[u]=-inf,因为不存在还没被覆盖的u了
否则如果g[u]=mid,则说明当前必须要放一个根在这里了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
const int inf=1e9+10;
int n,m,k,cnt,tot,cas,ans;
int a[maxl],f[maxl],g[maxl];
bool vis[maxl];
char s[maxl];
vector<int> e[maxl];
inline void prework()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n-1;i++)
{
int u,v;scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
}
inline void dfs(int u,int fa,int mid)
{
f[u]=inf;g[u]=0;
for

这篇博客详细介绍了如何运用二分搜索策略解决一道图论题目,涉及到关键点覆盖问题。通过定义f[u]和g[u]状态,博主展示了如何进行深度优先搜索并判断是否满足条件。最终通过不断调整二分查找的边界找到最少的关键点数。
最低0.47元/天 解锁文章
5万+





