#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
//快读板子省略
constexpr int kN=1e5+7;
struct edge{int v,t;};
std::vector<edge>s[kN];
int dep[kN],fa[kN];
bool edi[kN];
void dfs(int u,int &m){
for(auto[v,t]:s[u]){
if(v==fa[u])continue;
if((dep[v]=dep[u]+t)>dep[m])m=v;
fa[v]=u;dfs(v,m);
}
}
void dp(int u,int &m){
for(auto[v,t]:s[u]){
if(v==fa[u])continue;
dp(v,m);
m=std::max(m,t+dep[u]+dep[v]);
dep[u]=std::max(dep[u],dep[v]+t);
}
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n,k,m1,m2;fio>>n>>k;
for(int i=1,u,v;i<n;i++)fio>>u>>v,s[u].emplace_back(v,1),s[v].emplace_back(u,1);
dfs(1,m1);dep[m1]=fa[m1]=0;dfs(m1,m2);
int ans=((n-1)<<1)-(dep[m2]-1);
if(k==2){
while(m2)edi[m2]=true,m2=fa[m2];
for(int u=1;u<=n;u++)if(edi[u])for(auto&[v,t]:s[u])if(edi[v])t=-1;
m2=0;std::fill_n(dep+1,n,0);
dp(m1,m2);ans-=m2-1;
}
fio<<ans;
return 0;
}
这份代码在洛谷上能跑,但是在 AcWing 里跑不了,检查后发现是 emplacae_back 的问题,而且 SPOJ 上也不能这么用 emplace_back,Codeforces 可以使用,如果要使用必须 :
for(int i=1,u,v;i<n;i++)fio>>u>>v,s[u].emplace_back(edge{v,1}),s[v].emplace_back(edge{u,1});
这个报错是编译器不一样产生的问题吗?日常生活可以用吗?CSP NOIP可以用吗?