Pagini recente » Cod sursa (job #1616161) | Cod sursa (job #1352413) | Cod sursa (job #1987635) | Cod sursa (job #1274015) | Cod sursa (job #502336)
Cod sursa(job #502336)
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define pt(i) (1<<(i))
#define inf 2000000000
#define nmax 1005
vector<int> G[nmax];
int n, k;
int nrnod[nmax];
struct cmp
{
bool operator()(const int &a,const int &b) const
{
return nrnod[a]>nrnod[b];
}
};
void citire ()
{
int i, x, y;
freopen("salvare.in","r",stdin);
scanf("%d%d", &n, &k);
for (i = 1; i < n; ++i)
{
scanf("%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
}
int ok(int m)
{
int viz[nmax], c[nmax], leg[nmax], nr, x, y, i;
priority_queue<int, vector<int>, cmp> Q;
nr = k;
for (i = 1; i <= n; ++i)
{
viz[i] = 0; c[i] = inf; nrnod[i] = 0; if (G[i].size() == 1) { Q.push(i); c[i] = m; viz[i] = 1; } leg[i] = G[i].size();
}
while ( !Q.empty() )
{
x = Q.top(); Q.pop (); nrnod[x]++;
for (i = 0; i < G[x].size(); ++i)
{
y = G[x][i]; leg[y] --;
if ( !viz[y] )
{
c[y] = min(c[y], c[x] - 1); nrnod[y] +=nrnod[x];
if (leg[y] == 1)
{
Q.push(y); viz[y] = 1;
if ( c[y] == 0 ) { c[y] = 2*m+1; nr--; }
}
}
}
}
if ( nr < 0 ) return 1;
return 0;
}
void solve ()
{
int m = 0, i;
for (i = 30; i >= 0; --i)
if (m+pt(i)<=n && ok (m+pt(i)) )
m +=pt(i);
freopen("salvare.out","w",stdout);
printf("%d\n", m+1); m++;
int viz[nmax], c[nmax], leg[nmax], nr, x, y;
vector<int> vec;
priority_queue<int, vector<int>, cmp> Q;
nr = k;
for (i = 1; i <= n; ++i)
{
viz[i] = 0; c[i] = inf; nrnod[i] = 0; if (G[i].size() == 1) { Q.push(i); c[i] = m; viz[i] = 1; } leg[i] = G[i].size();
}
while ( !Q.empty() )
{
x = Q.top(); Q.pop (); nrnod[x]++;
for (i = 0; i < G[x].size(); ++i)
{
y = G[x][i]; leg[y] --;
if ( !viz[y] )
{
c[y] = min(c[y], c[x] - 1); nrnod[y] +=nrnod[x];
if (leg[y] == 1)
{
Q.push(y); viz[y] = 1;
if ( c[y] == 0 ) { c[y] = 2*m+1; nr--; vec.push_back(y); }
}
}
}
}
sort(vec.begin(), vec.end() );
for (i = 0; i < vec.size(); ++i) printf("%d ", vec[i]);
}
int main ()
{
citire ();
solve ();
return 0;
}