Pagini recente » Cod sursa (job #364881) | Cod sursa (job #145726) | Cod sursa (job #55374)
Cod sursa(job #55374)
Utilizator |
Mircea Pasoi domino |
Data |
27 aprilie 2007 10:46:47 |
Problema |
Salvare |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
2.06 kb |
#include <stdio.h>
int N, K, list[1000][1000], degree[1000], bst;
int queue[1000], dist[1000], up[1000], used[1000];
void read()
{
FILE *f;
int i, j, k;
f = fopen("salvare.in", "r");
fscanf(f, "%d\n", &N);
fscanf(f, "%d\n", &K);
for (k = 1; k < N; k++)
{
fscanf(f, "%d %d\n", &i, &j);
i--; j--;
list[i][degree[i]++] = j;
list[j][degree[j]++] = i;
}
fclose(f);
}
void DFS(int i)
{
int j;
for (j = 0; j < degree[i]; j++)
if (list[i][j] != up[i])
up[list[i][j]] = i,
DFS(list[i][j]);
}
int compute(int M)
{
int i, head = 0, tail = 0;
int deg[1000], num = 0;
for (i = 0; i < N; i++)
queue[i] = used[i] = 0,
dist[i] = 6666, deg[i] = degree[i];
for (i = N-1; i >= 0; i--)
if (deg[i] == 1) queue[tail++] = i, dist[i] = M;
for (; head < tail; head++)
{
i = queue[head];
if (!dist[i])
used[i] = 1, num++,
dist[i] = M + 1;
deg[i]--; deg[up[i]]--;
if (deg[up[i]] == 1)
queue[tail++] = up[i];
if (dist[up[i]] > dist[i] - 1)
dist[up[i]] = dist[i] - 1;
}
if (dist[0] && !num) num++;
return num;
}
void solve()
{
int l, r, m;
DFS(0);
for (l = 1, r = N; l < r; )
{
m = (l + r) >> 1;
if (compute(m) <= K)
r = m;
else
l = m + 1;
}
bst = l;
}
void write()
{
FILE *f;
int i, count = 0;
f = fopen("salvare.out", "w");
fprintf(f, "%d\n", bst);
compute(bst);
for (i = 0; i < N; i++)
if (used[i]) count++;
for (i = 0; i < N; i++)
if (!used[i] && count < K)
used[i] = 1,
count++;
for (i = 0; i < N; i++)
if (used[i]) fprintf(f, "%d ", i + 1);
fclose(f);
}
int main()
{
read();
solve();
write();
return 0;
}