Cod sursa(job #1860541)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 28 ianuarie 2017 10:31:30
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.74 kb
#include<bits/stdc++.h>
#define maxN 100005
#define INF INT_MAX
using namespace std;
int n,k,x,y,dp[maxN],sol,depth[maxN],dp2[maxN],vect[5],l[maxN],t[maxN],tata;
bool seen[maxN],OnBeach[maxN],Solutie[maxN];
vector<int> v[maxN],sons[maxN];
void IsOnBeach(int nod)
{
    l[nod]=INF;
    seen[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(!seen[*it])
        {
            sons[nod].push_back(*it);
            t[*it]=nod;
            IsOnBeach(*it);
            l[nod]=min(l[nod],1+l[*it]);
        }
    }
    if(sons[nod].empty()) OnBeach[nod]=1;
    if(l[nod]==INF) l[nod]=0;
}
void Finish(int nod)
{
    seen[nod]=1;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(!seen[*it])
        {
            int fiu=*it;
            int tata=t[*it];
            int pas=1;
            while(tata)
            {
                if((pas+dp[tata])<dp[fiu])
                {
                    dp2[fiu]=dp[fiu];
                    dp[fiu]=pas+dp[tata];
                }
                    else
                if((pas+dp[tata]<dp2[fiu]))
                {
                    dp2[fiu]=pas+dp[tata];
                }
                tata=t[tata];
            }
            Finish(*it);
        }
    }
}
void Solve(int nod)
{
    //dp[i]-distanta minima de la nod la o statiune de pe plaja
    //dp2[i]- a doua distanta minima
    //depth[i]-adancimea nodului
    //l-lungimea minima a subarborelui
   // l[nod]=INF;
    dp[nod]=INF;
    dp2[nod]=INF;
    if(OnBeach[nod] && nod!=1) dp[nod]=0;
    seen[nod]=0;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
        if(seen[*it])
        {
            depth[*it]=1+depth[nod];
            Solve(*it);
            if((1+dp[*it])<dp[nod])
            {
                dp2[nod]=dp[nod];
                dp[nod]=1+dp[*it];
            }
                else
            if((1+dp[*it])<dp2[nod])
            {
                dp2[nod]=1+dp[*it];
            }
        }
    }
}
int main()
{
    freopen("statiuni.in","r",stdin);
    freopen("statiuni.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    IsOnBeach(1);
    if(v[1].size()==1) OnBeach[1]=1;
    depth[1]=0;
    Solve(1);
    Finish(1);
    for(int i=1;i<=n;i++)
    {
        int dv=0;
        vect[++dv]=dp[i];
        vect[++dv]=dp2[i];
        if(OnBeach[1]) vect[++dv]=depth[i];
        sort(vect+1,vect+dv+1);
        if(vect[1]<=k && vect[2]<=k) Solutie[i]=1;
    }
    for(int i=1;i<=n;i++) sol=sol+Solutie[i];
    printf("%d\n",sol);
    return 0;
}