您的位置:首页 > 其它

BZOJ2599: [IOI2011]Race

2016-03-13 07:19 357 查看
点分

我是用map存的可能多了个log

但是跑得过去233333

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<set>
#include<map>
using namespace std;

char c;
inline void read(int &a)
{a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}
map<int,int>Cache,Cach;
struct Chain
{
int  u,len;
Chain*next;
Chain(){next=NULL;}
}*Head[200001];

inline void Add(int u,int v,int len){Chain *tp=new Chain;tp->u=v;tp->len=len;tp->next=Head[u];Head[u]=tp;}
int n,k;
int Heavy[200001];
int  size[200001];
bool chn[200001];
int Root;
int Max;
void FindRoot(int u,int f)
{
Heavy[u]=0;
size[u]=1;
for(Chain *tp=Head[u];tp;tp=tp->next)
if(tp->u!=f&&!chn[tp->u])
{
FindRoot(tp->u,u);
size[u]+=size[tp->u];
if(size[tp->u]>Heavy[u])Heavy[u]=size[tp->u];
}
Heavy[u]=max(Heavy[u],Max-size[u]);
if(Heavy[u]<Heavy[Root])Root=u;
}
int MaxLen;
int Ans=1<<29;
void DFS(int u,int f,int Cur,int Has)
{
if(Cur==k)
Ans=min(Has,Ans);
MaxLen=max(MaxLen,Cur);
if(Cach[Cur]>Has||!Cach[Cur])Cach[Cur]=Has;
for(Chain *tp=Head[u];tp;tp=tp->next)
if(tp->u!=f&&!chn[tp->u])
DFS(tp->u,u,Cur+tp->len,Has+1);
}

void Div(int u)
{
MaxLen=0;
chn[u]=true;
Cache.clear();
map<int,int>::iterator B,E;
for(Chain *tp=Head[u];tp;tp=tp->next)
if(!chn[tp->u])
{
Cach.clear();
DFS(tp->u,u,tp->len,1);
B=Cach.begin();E=Cach.end();
for(;B!=E;B++)
{
if(Cache[k-B->first])
Ans=min(Ans,B->second+Cache[k-B->first]);
}
B=Cach.begin();
for(;B!=E;B++)
{
if(Cache[B->first]>B->second||!Cache[B->first])
Cache[B->first]=B->second;
}
}
int Old=Max;
for(Chain *tp=Head[u];tp;tp=tp->next)
if(!chn[tp->u])
{
Max=size[tp->u]>size[u]?Old-size[u]:size[tp->u];
Root=0;
FindRoot(tp->u,u);
Div(Root);
}

}

int main()
{
int i,j,t,l;
read(n),read(k);
for(i=2;i<=n;i++)
read(j),read(t),read(l),Add(++j,++t,l),Add(t,j,l);
Heavy[0]=Ans;
Max=n;
FindRoot(1,1);
Div(Root);
printf("%d\n",Ans==1<<29?-1:Ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: