记录编号 392088 评测结果 AAAAAAAAAAAAAAAA
题目名称 [IOI 2011] Race 最终得分 100
用户昵称 Gravatar_Itachi 是否通过 通过
代码语言 C++ 运行时间 1.972 s
提交时间 2017-04-07 07:38:58 内存使用 14.98 MiB
显示代码纯文本
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char cc;inline void R_int(int &x){
	while(cc=getchar(),cc<'!');x=cc-48;
	while(cc=getchar(),cc>'!')x=x*10+cc-48;
}
const int maxn=200005,INF=0x3f3f3f3f;
struct Rabit_tree{int to,next,dis;}e[maxn<<1];int us[1000005],tim=0,mp[1000005];
int n,K,head[maxn],len=1,size[maxn],mx[maxn],RT,Sz,ans=INF;bool vis[maxn];
void Set(int prt,int son,int dis){
	e[++len].to=son,e[len].next=head[prt],head[prt]=len,e[len].dis=dis;
}
#define to e[i].to
void Rabit_in(){
	R_int(n),R_int(K);int i,x,y,z;
	for(i=1;i<n;i++)R_int(x),R_int(y),x++,y++,R_int(z),Set(x,y,z),Set(y,x,z);
}
void Get(int rt,int fa){
	size[rt]=1,mx[rt]=0;
	for(int i=head[rt];i;i=e[i].next)
		if(!vis[to]&&to^fa)Get(to,rt),size[rt]+=size[to],mx[rt]=max(mx[rt],size[to]);
	mx[rt]=max(mx[rt],Sz-size[rt]);
	if(mx[rt]<mx[RT])RT=rt;
}
void Run(int rt,int fa,int Dp,int dis){
	if(dis>K)return;
	if(us[K-dis]==tim)ans=min(ans,Dp+mp[K-dis]);
	for(int i=head[rt];i;i=e[i].next)
		if(to^fa&&!vis[to])Run(to,rt,Dp+1,dis+e[i].dis);
}
void Set(int rt,int fa,int Dp,int dis){
	if(dis>K)return;
	if(us[dis]^tim)us[dis]=tim,mp[dis]=Dp;else mp[dis]=min(mp[dis],Dp);
	for(int i=head[rt];i;i=e[i].next)
		if(to^fa&&!vis[to])Set(to,rt,Dp+1,dis+e[i].dis);
}
void Get(int rt){
	us[0]=++tim,mp[0]=0;
	for(int i=head[rt];i;i=e[i].next)
		if(!vis[to])Run(to,0,1,e[i].dis),Set(to,0,1,e[i].dis);
}
void Run(int rt){
	vis[rt]=true;Get(rt);
	for(int i=head[rt];i;i=e[i].next)
		if(!vis[to])Sz=size[to],RT=0,Get(to,0),Run(RT);
}
#define APPLY_LANGER_STACK \
	int __size__=32<<20; \
	char *__p__=(char*)malloc(__size__)+__size__; \
	__asm__("movl %0, %%esp\n"::"r"(__p__))
int main(){
	freopen("ioi2011-race.in","r",stdin);freopen("ioi2011-race.out","w",stdout);
	APPLY_LANGER_STACK;
	Rabit_in(),mx[RT=0]=maxn,Sz=n,Get(1,0),Run(RT);
	printf("%d\n",ans<INF?ans:-1);
	fclose(stdin);fclose(stdout);return 0;
}