Pagini recente » Cod sursa (job #2302615) | Cod sursa (job #2107710) | Cod sursa (job #1718901) | Cod sursa (job #3226527) | Cod sursa (job #697080)
Cod sursa(job #697080)
#include <fstream>
#include <queue>
using namespace std;
#define in "cezar.in"
#define out "cezar.out"
#define maxn 10007
struct graf
{
short info;
graf *next;
};
graf *g[maxn];
short nr[maxn];
int s[maxn],K,N,cnt;
bool viz[maxn];
priority_queue<short> h;
inline void push(short x,short y)
{
graf *q = new graf;
q->info = y;
q->next = g[x];
g[x] = q;
}
void read()
{
ifstream fin(in);
fin>>N>>K;
int i;
short x,y;
for(i = 1; i <= N; i++)
g[i] = NULL;
for(i = 1; i < N; i++)
{
fin>>x>>y;
push(x,y);
push(y,x);
}
}
void df(int nod)
{
viz[nod] = 1;
nr[nod] = 1;
s[nod] = 0;
for(graf *q = g[nod]; q != NULL; q = q->next)
if(!viz[q->info])
{
df(q->info);
nr[nod] += nr[q->info];
s[nod] += s[q->info] + nr[q->info];
}
}
void df1(int nod,int t)
{
viz[nod] = 1;
if(t != 0)
s[nod] = s[t] + N - 2 * nr[nod];
for(graf *q = g[nod]; q != NULL; q = q->next)
if(!viz[q->info])
df1(q->info,nod);
}
void solve()
{
ofstream fout(out);
int r,min = 1000000000,i,sol;
df(1);
for(i = 1; i <= N; i++)
viz[i] = 0;
df1(1,0);
for(i = 1; i <= N; i++)
{
viz[i] = 0;
if(s[i] < min)
min = s[i], r = i;
}
df(r);
sol = s[r];
for(i = 1; i <= N; i++)
if(i != r)
h.push(nr[i]);
while(K--)
{
sol -= h.top();
h.pop();
}
fout<<sol<<'\n';
}
int main()
{
read();
solve();
return 0;
}