很明显,走过的点可以走回去,需要花费2的代价,我们第一次贪心地走最长链,可以发现剩下的步数都肯定用在走到某个点再回来上面,所以就把剩下的除以个2再加上最长链长度就好了
为什么一个
O
(
n
)
O(n)
O(n)的题给的数据范围是1000???
Code:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int N=105;
int dep[N],pt[N],vis[N<<1],nxt[N<<1],head[N<<1],tot=0;
inline void add(int x,int y){vis[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
void dfs(int v){
pt[v]=1;
for(int i=head[v];i;i=nxt[i]){
if(pt[vis[i]]) continue;
dep[vis[i]]=dep[v]+1;
dfs(vis[i]);
}
}
int n,k;
int main(){
n=read();k=read();
for(int x,y,i=1;i<n;i++) x=read()+1,y=read()+1,add(x,y),add(y,x);
dfs(1);
sort(dep+1,dep+n+1);
if(dep[n]>k) cout<<k+1;
else cout<<min((k-dep[n]+1)/2+dep[n],n);
return 0;
}