Pagini recente » Cod sursa (job #1412496) | Cod sursa (job #1516256) | Cod sursa (job #2639268) | Cod sursa (job #3189407) | Cod sursa (job #2504738)
#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;
}