Pagini recente » Cod sursa (job #55449) | Cod sursa (job #913306) | Cod sursa (job #67380) | Cod sursa (job #2293707) | Cod sursa (job #55429)
Cod sursa(job #55429)
Utilizator |
Mircea Pasoi domino |
Data |
27 aprilie 2007 13:59:05 |
Problema |
Salvare |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
2.23 kb |
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAXN 1005
int N, K;
vector<int> con[MAXN];
int p[MAXN];
int dist[MAXN][MAXN];
vector< pair<int, int> > x;
int insol[MAXN];
char used[MAXN];
void dfs( int k, int alt, int father )
{
if (used[k])
return;
used[k] = 1;
p[k] = father;
x.push_back( make_pair(alt, k) );
vector< int > :: iterator it;
for (it = con[k].begin(); it != con[k].end(); it++)
dfs( *it, alt + 1, k );
}
inline void markUsed( int k, int D )
{
for (int i = 1; i <= N; i++)
if (dist[k][i] <= D)
used[i] = 1;
}
inline int isOK( int D )
{
memset(used, 0, sizeof(used));
memset(insol, 0, sizeof(insol));
for (int i = 0; i < N; i++)
{
int k = x[i].second;
if (used[k])
continue;
for (int step = 0; step < D && k != 1; step++)
k = p[k];
insol[k] = 1;
markUsed(k, D);
}
int NR = 0;
for (int i = 1; i <= N; i++)
NR += insol[i];
return NR <= K;
}
inline int cmp( pair<int, int> a, pair<int, int> b )
{
return a > b;
}
queue<int> Q;
inline void getDist( int k )
{
for (; !Q.empty(); Q.pop());
dist[k][k] = 0;
for (Q.push(k); !Q.empty(); Q.pop())
{
int i = Q.front();
vector<int> :: iterator it;
for (it = con[i].begin(); it != con[i].end(); it++)
if (dist[k][i] + 1 < dist[k][*it])
{
dist[k][*it] = dist[k][i] + 1;
Q.push(*it);
}
}
}
vector<int> SOL;
int main()
{
freopen("salvare.in", "rt", stdin);
freopen("salvare.out", "wt", stdout);
scanf("%d %d", &N, &K);
for (int i = 0; i < N - 1; i++)
{
int a, b;
scanf("%d %d", &a, &b);
con[a].push_back(b);
con[b].push_back(a);
}
dfs(1, 1, 1);
sort( x.begin(), x.end(), cmp );
memset( dist, 0x3f, sizeof(dist) );
for (int i = 1; i <= N; i++)
getDist(i);
int sol, step;
for (sol = -1, step = 512; step; step >>= 1)
if (sol + step <= N && !isOK(sol + step))
sol += step;
sol++;
printf("%d\n", sol);
isOK(sol);
int SNR = K;
for (int i = 1; i <= N; i++)
if (insol[i])
SOL.push_back(i),
SNR--;
int p = 1;
for (; SNR; SNR--)
{
for (; insol[p]; p++);
insol[p] = 1;
SOL.push_back(p);
}
sort( SOL.begin(), SOL.end() );
printf("%d", SOL[0]);
for (int i = 1; i < (int)SOL.size(); i++)
printf(" %d", SOL[i]);
printf("\n");
return 0;
}