luogu3698 [CQOI2017]小Q的棋盘
最长链是根节点到深度最深的结点的路径。
显然,要么直接走最长链,要么兜兜转转几个圈圈再走最长链,而最长链以外的结点因为要“兜圈”,所以要经过两次。
#include <iostream>
#include <cstdio>
using namespace std;
int n, v, hea[105], cnt, uu, vv, zcl, dep[105], ans;
struct Edge{
int too, nxt;
}edge[205];
void add_edge(int fro, int too){
edge[++cnt].nxt = hea[fro];
edge[cnt].too = too;
hea[fro] = cnt;
}
void dfs(int x, int f){
dep[x] = dep[f] + 1;
zcl = max(zcl, dep[x]);
for(int i=hea[x]; i; i=edge[i].nxt){
int t=edge[i].too;
if(t!=f) dfs(t, x);
}
}
int main(){
cin>>v>>n;
for(int i=1; i<v; i++){
scanf("%d %d", &uu, &vv);
uu++;
vv++;
add_edge(uu, vv);
add_edge(vv, uu);
}
dfs(1, 0);
if(n+1<=zcl) ans = n + 1;
else ans = min(v, (n+1-zcl)/2+zcl);
cout<<ans<<endl;
return 0;
}
拙いものと思えども、
その手に握る其れこそが、
いつか幻想を生んでいく。