欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019.03.11 bzoj4813: [Cqoi2017]小Q的棋盘(贪心)

程序员文章站 2022-05-08 18:29:56
...

传送门
考虑最后所有走过的点构成的树,显然除了最长链走一遍以外每条轻链都走两遍。
于是求一波最长链搞一搞就完了。
注意几个小细节特判qwq
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
    static char buf[rlen],*ib,*ob;
    (ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
    return ib==ob?-1:*ib++;
}
inline int read(){
    int ans=0;
    char ch=gc();
    while(!isdigit(ch))ch=gc();
    while(isdigit(ch))ans=(ans+(ans<<2)<<1)+(ch^48),ch=gc();
    return ans;
}
const int N=105;
int n,mx=0,k;
vector<int>e[N];
void dfs(int p,int fa,int dep){
    mx=max(mx,dep);
    for(ri i=0;i<e[p].size();++i)if(e[p][i]^fa)dfs(e[p][i],p,dep+1);
}
int main(){
    n=read(),k=read();
    for(ri i=1,u,v;i<n;++i)u=read()+1,v=read()+1,e[u].push_back(v),e[v].push_back(u);
    dfs(1,0,0);
    cout<<(k<=mx?k+1:min(n,mx+(k-mx)/2+1));
    return 0;
}