Cod sursa(job #1704992)

Utilizator george_stelianChichirim George george_stelian Data 19 mai 2016 19:32:30
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MaxN=200010,MaxK=1000010,inf=1000000000;
struct edge
{
    int nod,l;
};
vector<edge> v[MaxN];
int size[MaxN],din[MaxK],dist[MaxN],niv[MaxN],q[MaxN],nr,centru,k,sol;
char elim[MaxN];

void dfs1(int nod,int tata,int n)
{
    size[nod]=1;
    int ok=1;
    for(vector<edge>::iterator it=v[nod].begin();it!=v[nod].end();it++)
        if(!elim[it->nod] && it->nod!=tata)
        {
            dfs1(it->nod,nod,n);
            size[nod]+=size[it->nod];
            if(size[it->nod]>n/2+1) ok=0;
        }
    if(ok && n-size[nod]<=n/2+1) centru=nod;
}

void dfs2(int nod,int tata,int d,int lev)
{
    if(d>k) return;
    q[++nr]=nod;
    dist[nod]=d;
    niv[nod]=lev;
    for(vector<edge>::iterator it=v[nod].begin();it!=v[nod].end();it++)
        if(!elim[it->nod] && it->nod!=tata)
            dfs2(it->nod,nod,d+it->l,lev+1);
}

void rezolva(int rad)
{
    nr=0;
    for(vector<edge>::iterator it=v[rad].begin();it!=v[rad].end();it++)
        if(!elim[it->nod])
        {
            int last=nr;
            dfs2(it->nod,rad,it->l,1);
            for(int i=last+1;i<=nr;i++)
            {
                if(k==dist[q[i]]) sol=min(sol,niv[q[i]]);
                if(k>=dist[q[i]] && din[k-dist[q[i]]]) sol=min(sol,niv[din[k-dist[q[i]]]]+niv[q[i]]);
            }
            for(int i=last+1;i<=nr;i++)
                if(din[dist[q[i]]]==0 || niv[q[i]]<niv[din[dist[q[i]]]]) din[dist[q[i]]]=q[i];
        }
    for(int i=1;i<=nr;i++)
        din[dist[q[i]]]=0;
}

void solve(int nod,int n)
{
    dfs1(nod,0,n);
    int center=centru;
    rezolva(center);
    elim[center]=1;
    for(vector<edge>::iterator it=v[center].begin();it!=v[center].end();it++)
        if(!elim[it->nod])
            if(size[it->nod]>size[center]) solve(it->nod,n-size[center]);
            else solve(it->nod,size[it->nod]);
}

int main()
{
    freopen("file.in", "r", stdin);
    freopen("file.out", "w", stdout);
    int n,x,y,l;
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&l);x++;y++;
        v[x].push_back({y,l});
        v[y].push_back({x,l});
    }
    sol=inf;
    solve(1,n);
    if(sol==inf) sol=-1;
    printf("%d",sol);
    return 0;
}