社区讨论

TLE75pts

P4149[IOI 2011] Race参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mk9pvofd
此快照首次捕获于
2026/01/11 20:35
上个月
此快照最后确认于
2026/01/11 20:47
上个月
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int f=1,x=0;
	char s=getchar();
	while(s<'0'||s>'9'){
		if(s=='-') f=-1;
		s=getchar();
	}
	while(s>='0'&&s<='9'){
		x=(x<<1)+(x<<3)+(s^48);
		s=getchar();
	}
	return x*f;
}
const int N=1e6+5;
int n,k,ans=1e9,tot; 
int cnt;
int to[N],we[N],nxt[N],hd[N];
void Add(int u,int v,int w){
	to[++cnt]=v;
	we[cnt]=w;
	nxt[cnt]=hd[u];
	hd[u]=cnt;
}
int rt;
int siz[N];
bool vis[N];
void DfsRt(int u,int fa){
	siz[u]=1;
	int mx=0;
	for(int i=hd[u];i;i=nxt[i]){
		if(to[i]==fa||vis[to[i]]) continue;
		DfsRt(to[i],u);
		siz[u]+=siz[to[i]];
		mx=max(mx,siz[to[i]]); 
	}
	mx=max(mx,tot-siz[u]);
	if(mx*2<=n) rt=u;
}
int dp[N];
int cntd;
int dis1[N],dis2[N];
void GetDis(int u,int fa,int d1,int d2){
	if(d1>k) return;
	dis1[++cntd]=d1;
	dis2[cntd]=d2;
	for(int i=hd[u];i;i=nxt[i]){
		if(to[i]==fa||vis[to[i]]) continue;
		GetDis(to[i],u,d1+we[i],d2+1);
	}
}
void Dp(int u){
	dp[0]=0; cntd=0;
	for(int i=hd[u];i;i=nxt[i]){
		if(vis[to[i]]) continue;
		int resd=cntd;
		GetDis(to[i],u,we[i],1);
		for(int i=resd+1;i<=cntd;i++)
			ans=min(ans,dp[k-dis1[i]]+dis2[i]);
		for(int i=resd+1;i<=cntd;i++)
			dp[dis1[i]]=min(dp[dis1[i]],dis2[i]);
	}
	for(int i=1;i<=cntd;i++) dp[dis1[i]]=1e9;
}
void Work(int u){
	vis[u]=1;
	Dp(u);
	for(int i=hd[u];i;i=nxt[i]){
		if(vis[to[i]]) continue;
		tot=siz[to[i]];
		rt=0;
		DfsRt(to[i],u);
		Work(rt);
	}
}
int main(){
	n=read(); k=read();
	for(int i=1;i<n;i++){
		int u=read()+1,v=read()+1,w=read();
		Add(u,v,w);
		Add(v,u,w);
	}
	tot=n;
	DfsRt(1,0);
	memset(dp,0x3f,sizeof dp);
	Work(rt);
	if(ans>=n) cout<<-1;
	else cout<<ans;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...