记录编号 454464 评测结果 AAAAAAAAAAAAAAAA
题目名称 [IOI 2011] Race 最终得分 100
用户昵称 GravatarCooook 是否通过 通过
代码语言 C++ 运行时间 3.019 s
提交时间 2017-09-28 21:30:58 内存使用 13.48 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>
#define MAXN 200005ul
#define MAXM 1000005ul
#define inf 0x3f3f3f3f
int f[MAXN],mn[MAXM],size[MAXN],dis[MAXN],root,first[MAXN],Ans = inf,num,e = 1,n,k;
bool vis[MAXN];
 
 
template<typename _t>
inline _t read(){
    _t x=0,f=1;
    char ch=getchar();
    for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-f;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+(ch^48);
    return x*f;
}
 
struct edge{
    int u,v,w,next;
}a[MAXN<<1];
 
inline void push(int u,int v,int w){
    a[e].u = u;a[e].v = v;a[e].w = w;
    a[e].next = first[u];  first[u] = e++;
}
 
inline void G_root(int u,int fa){
    size[u] = 1;f[u] = 0;
    for(int i = first[u];i;i = a[i].next) {
        register int v = a[i].v;
        if(vis[v] || v == fa) continue;
        G_root(v,u);
        size[u] += size[v];
        f[u] = std::max(f[u],size[v]);
    }
    f[u] = std::max(f[u],num - f[u]);
    if(f[u] < f[root]) root = u;
}
 
inline void U(int u,int fa,int QWQ){
    if(dis[u] <= k)
        Ans = std::min(Ans,mn[k - dis[u]] + QWQ);
    for(int i = first[u];i;i=a[i].next)
        if(!vis[a[i].v] && a[i].v != fa)dis[a[i].v] = dis[u] + a[i].w, U(a[i].v,u,QWQ+1);
}
 
inline void A(int u,int fa,int QWQ){
    if(dis[u] <= k) 
        mn[dis[u]] = std::min(mn[dis[u]],QWQ);
    for(int i = first[u];i;i=a[i].next)
        if(!vis[a[i].v] && a[i].v != fa) A(a[i].v,u,QWQ+1);
}
 
inline void erase(int u,int fa){
    if(dis[u] <= k) mn[dis[u]] = inf;
    for(int i = first[u];i;i = a[i].next) 
        if(!vis[a[i].v] && a[i].v != fa) erase(a[i].v,u);
}
 
inline void Calc(int u){
    dis[u] = 0;
    for(int i = first[u];i;i = a[i].next)
        if(!vis[a[i].v]) dis[a[i].v] = a[i].w,U(a[i].v,u,1),A(a[i].v,u,1);
    for(int i = first[u];i;i = a[i].next) 
        if(!vis[a[i].v]) erase(a[i].v,u);
    return;
}
 
inline void dfs(int u){
    vis[u] = 1; mn[0] = 0; Calc(u);
    for(int i = first[u];i;i = a[i].next) {
        register int v = a[i].v;
        if(vis[v]) continue;
        num = size[a[i].v]; root = 0;
        G_root(a[i].v,0); 
        dfs(root);
    }
}
 
int main(){
    freopen("ioi2011-race.in","r",stdin);
    freopen("ioi2011-race.out","w",stdout);
    int size = 128 << 20;
    char *p = (char*)malloc(size) + size;  
    __asm__("movl %0, %%esp\n" :: "r"(p));
    n = read<int>(); k = read<int>();
    for(int i = 1;i<n;i++) {
        int u = read<int>() + 1 ,v = read<int>() + 1,w = read<int>();
        push(u,v,w); push(v,u,w);
    }
    memset(mn,0x3f,sizeof mn); mn[0] = 0; num = n;
    root = 0;f[0] = inf; G_root(1,0); dfs(root);
    printf("%d\n",Ans == inf?-1:Ans);
    // getchar(); getchar();
    return 0;
}