Cod sursa(job #2504738)

Utilizator cezarus30cezarus30 cezarus30 Data 5 decembrie 2019 14:54:58
Problema Orase Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>

#include <fstream>

#include <queue>



using namespace std;



ifstream in ("cezar.in");

ofstream out ("cezar.out");



const int N=10001;

int lst[N],vf[2*N],urm[2*N],n,nr,grad[N],suma[N];

struct nod

{

    int sum,i;

};



bool operator<( const nod& a, const  nod& b )

{

    return b.sum < a.sum;

}

void adauga (int x,int y)

{

    vf[++nr]=y;

    urm[nr]=lst[x];

    lst[x]=nr;

}

priority_queue <nod> q;



int main()

{

    int k,x,y;

    long long sol=0;

    in>>n>>k;

    for (int i=1;i<n;i++)

    {

        in>>x>>y;

        adauga (x,y);

        adauga (y,x);

        grad[x]++;

        grad[y]++;

        suma[i]=1;

    }

    suma[n]=1;

    int dram=n-1-k;

    for (int i=1;i<=n;i++)

        if (grad[i]==1)

        {

            nod l;

            l.i=i;

            l.sum=1;

            q.push(l);

        }

    while (dram--)

    {

        nod l=q.top();

        int s=l.sum;

        x=l.i;

        q.pop();

        for (int p=lst[x];p!=0;p=urm[p])

        {

            y=vf[p];

            grad[y]--;

            suma[y]+=suma[x];

            if (grad[y]==1)

            {

                nod l;

                l.i=y;

                l.sum=suma[y];

                q.push(l);

            }

        }

        sol+=s;

    }

    out<<sol;

    return 0;

}