Pagini recente » Cod sursa (job #2823117) | Cod sursa (job #1339699) | Cod sursa (job #2702987) | Cod sursa (job #760109) | Cod sursa (job #834712)
Cod sursa(job #834712)
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
#define MAX 1005
#define LMAX 11
#define pb push_back
using namespace std;
int N, V[MAX], K, lvl[MAX], a, b, sol, TT[LMAX][MAX], log[MAX], maxim;
int marked[MAX];
vector<int> v[MAX], part, vSol;
void dfs(int nod, int dad)
{
lvl[nod] = lvl[dad] + 1; TT[0][nod] = dad;
for(size_t i = 0; i < v[nod].size(); i++)
{
if(v[nod][i] == dad) continue;
dfs(v[nod][i], nod);
}
}
bool cmp(int a, int b)
{
return lvl[a] > lvl[b];
}
void mark(int nod, int dist)
{
if(!dist) return;
marked[nod] = dist;
for(size_t i = 0; i < v[nod].size(); i++)
{
if(dist - 1 > marked[v[nod][i]])
mark(v[nod][i], dist - 1);
}
}
int nth_dad(int nod, int src)
{
for(int i = 0; i < LMAX && nod; i++)
if((1 << i) & src)
nod = TT[i][nod];
return (nod ? nod : 1);
}
bool ok(int dist)
{
memset(marked, 0, sizeof(marked));
part.clear();
for(int i = 1; i <= N; i++)
if(!marked[V[i]])
{
int start = nth_dad(V[i], dist);
part.pb(start);
if(part.size() > K) return false;
mark(start, dist + 1);
}
return true;
}
void buildDads()
{
for(int i = 1; i <= log[N]; i++)
for(int j = 1; j <= N; j++)
TT[i][j] = TT[i - 1][TT[i - 1][j]];
}
void citire()
{
ifstream in("salvare.in"); in>>N>>K;
for(int i = 1; i < N; i++)
{
in>>a>>b;
v[a].pb(b);
v[b].pb(a);
} in.close();
}
void afisare()
{
memset(marked, 0, sizeof(marked));
for(size_t i = 0; i < vSol.size(); i++) marked[vSol[i]] = 1;
for(int i = 1, k = K - vSol.size(); k; i++) if(!marked[i]) vSol.pb(i), k--;
sort(vSol.begin(), vSol.end());
ofstream out("salvare.out"); out<<sol<<"\n";
for(size_t i = 0; i < vSol.size(); i++) out<<vSol[i]<<" ";
out.close();
}
void preprocess()
{
dfs(1, 0);
for(int i = 1; i <= N; i++) V[i] = i, log[i] = log[i >> 1] + 1;
sort(V + 1, V + N + 1, cmp);
buildDads();
}
void solve()
{
int L = 0, R = N / K + 1;
while(L <= R)
{
int mid = (L + R) >> 1;
if(ok(mid))
{
sol = mid;
vSol = part;
R = mid - 1;
}
else
L = mid + 1;
}
}
int main()
{
citire();
preprocess();
solve();
afisare();
return 0;
}