Wa on #7
造了几个菊花图的小样例,似乎并没有错。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 200010;
map<ll,ll> disa,disb;
ll ans = 1145141919810;
struct Edge{
ll to,val;
};
vector<Edge> vec[N];
ll n,k;
bool vis[N];
ll siz[N],rt,tot,limits;
void dfs(ll id,ll fa){
siz[id] = 1;
ll delt = 0;
for(auto u : vec[id]){
ll v = u.to;
if(vis[v]||v==fa) continue;
dfs(v,id);
siz[id]+=siz[v];
delt = max(delt,siz[v]);
}
if(max(delt,tot-siz[id])<=limits){
limits = max(delt,tot-siz[id]);
rt = id;
}
}
void Getrt(ll x){
rt = 0;
limits = 1e12;
dfs(x,x);
}
void altr(ll id,ll fa,ll dis,ll step){
disb.insert(make_pair(dis,step));
for(auto u : vec[id]){
ll v = u.to;
if(vis[v]) continue;
if(v==fa) continue;
altr(v,id,dis+u.val,step+1);
}
}
void solve(ll x){
vis[x] = true;
disa.clear();
disa.insert(make_pair(0,0));
for(auto u : vec[x]){
ll v = u.to;
if(vis[v]) continue;
disb.clear();
altr(v,v,u.val,1);
for(auto i : disb){
if(disa.find(k-i.first)!=disa.end()){
ans = min(ans,disa.find(k-i.first)->second+i.second);
}
}
disa.insert(disb.begin(),disb.end());
}
for(auto u : vec[x]){
ll v = u.to;
if(vis[v]) continue;
tot = siz[v];
Getrt(v);
solve(rt);
}
}
int main(){
scanf("%lld%lld",&n,&k);
for(ll i = 1; i < n; i++){
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
u++;v++;
vec[u].push_back((Edge){v,w});
vec[v].push_back((Edge){u,w});
}
memset(vis,false,sizeof(vis));
tot = n;
memset(siz,0x3f,sizeof(siz));
Getrt(1);
solve(rt);
if(ans!=1145141919810) printf("%lld\n",ans);
else puts("-1");
return 0;
}