95 pts?
查看原帖
95 pts?
220824
yyz1005楼主2023/4/8 15:55

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;
}
2023/4/8 15:55
加载中...