Cod sursa(job #2032358)

Utilizator patcasrarespatcas rares danut patcasrares Data 4 octombrie 2017 21:00:57
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<fstream>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<bitset>
using namespace std;
ifstream fin("cezar.in");
ofstream fout("cezar.out");
int n,k,a,b,nr,pr,ur=1,c,s;
short v[10005],y[10005],fr[10005],inq[10005];
bitset<10005>f;
vector<pair<short,short> >x[10005];
queue<short>q[2];
queue<short>qu;
queue<short>t;
void ve()
{
    int nod,vecin;
    while(nr>2)
    {
        while(!q[pr].empty())
        {
            nod=q[pr].front();
            q[pr].pop();
            nr--;
            y[nod]++;
            f[nod]=1;
            //cout<<'\n'<<nod<<'\n';
            for(auto i:x[nod])
            {
                v[i.first]--;
               // cout<<i.first<<'\n';
                if(!f[i.first])
                {
                  //  cout<<'\n'<<i.first<<'\n';
                    s+=y[nod];
                    fr[i.second]+=y[nod];
                    y[i.first]+=y[nod];
                }
                if(v[i.first]<2&&v[i.first]>=0&&!f[i.first])
                {
                    q[ur].push(i.first);
                }
            }
        }
        pr=1-pr;
        ur=1-ur;
    }
}
int cmp(int A,int B)
{
    return A>B;
}
int main()
{
    cout<<sizeof(v)*5/(1000);
    fin>>n>>k;
    for(int i=1;i<n;i++)
    {
        fin>>a>>b;
        x[a].push_back(make_pair(b,i));
        x[b].push_back(make_pair(a,i));
        v[a]++;
        v[b]++;
    }
    for(int i=1;i<=n;i++)
        if(v[i]==1)
        {
            q[pr].push(i);
          //  cout<<'\n'<<i;
        }
    nr=n;
    ve();
    c=q[pr].front();
    q[pr].pop();
    //cout<<' '<<c<<' '<<s;
    if(!q[pr].empty())
        if(q[pr].front()!=c)
    {
        //cout<<c<<' '<<q[pr].front();
        s+=y[c]+1;
        for(auto i:x[c])
            if(i.first==q[pr].front())
                fr[i.second]+=y[c]+1;
        c=q[pr].front();
    }
    sort(fr+1,fr+n-1,cmp);
    for(int i=1;i<=k;i++)
        s-=fr[i];
    fout<<s;
}