Pagini recente » Cod sursa (job #1904631) | Cod sursa (job #299731) | Cod sursa (job #2393403) | Cod sursa (job #2209495) | Cod sursa (job #71174)
Cod sursa(job #71174)
#include <stdio.h>
#include <vector>
using namespace std;
const char iname[] = "salvare.in";
const char oname[] = "salvare.out";
#define nlim 1007
#define PB push_back
vector <int> G[nlim];
int Deg[nlim];
int n;
bool s[nlim];
int f(const int k)
{
int q[nlim], h = 0, t = 0;
int deg[nlim];
int d[nlim];
bool u[nlim] = {false};
for (int i = 1; i <= n; ++ i)
deg[i] = Deg[i], s[i] = false;
for (int i = 1; i <= n; ++ i)
if (deg[i] == 1) d[q[t ++] = i] = k, u[i] = true;
for (; h < t; ++ h) {
int x = q[h];
int fwd;
if (d[x] == 0)
fwd = ((k > 0) ? (2 * k + 1) : (0)), s[x] = true;
else
fwd = d[x] - 1;
for (int i = 0; i < (int)(G[x].size()); ++ i) {
int y = G[x][i];
if (deg[y] > 1) {
if (u[y] == false)
d[y] = fwd, u[y] = true;
else if (u[y] == true)
if (d[y] > fwd)
d[y] = fwd;
if ((-- deg[y]) == 1)
q[t ++] = y;
}
}
}
int cnt = 0;
for (int i = 1; i <= n; ++ i)
if (s[i] == true) cnt ++;
if (cnt == 0)
cnt = 1, s[q[t - 1]] = true;
return cnt;
}
int main(void)
{
int k;
FILE *fi = fopen(iname, "r");
fscanf(fi, "%d", &n);
fscanf(fi, "%d", &k);
for (int i = 1; i < n; ++ i) {
int x, y;
fscanf(fi, "%d %d", &x, &y);
G[x].PB(y);
G[y].PB(x);
Deg[x] ++, Deg[y] ++;
}
fclose(fi);
int delta = 1024, d;
for (d = 0; delta; delta >>= 1)
if (f(d + delta) > k) d += delta;
if (f(d) > k) d ++;
if (d == 0) for (;;);
int cnt = f(d);
for (int i = 1; i <= n; ++ i) {
if ((cnt < k) && (s[i] == false))
s[i] = true, cnt ++;
}
FILE *fo = fopen(oname, "w");
fprintf(fo, "%d\n", d);
for (int i = 1; i <= n; ++ i)
if (s[i] == true) fprintf(fo, "%d ", i);
fclose(fo);
return 0;
}