Pagini recente » Cod sursa (job #3241314) | Cod sursa (job #2439749) | Cod sursa (job #1999263) | Cod sursa (job #2445321) | Cod sursa (job #569079)
Cod sursa(job #569079)
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
#define Nmax 1010
#define Kmax 510
#define INF (1 << 30)
int n, k, X, K;
int viz[Nmax], A[Nmax], B[Nmax], T[Nmax];
vector <int> V[Nmax];
void citire () {
int i, x, y;
scanf ("%d %d", &n, &k);
for (i = 1; i < n; i++) {
scanf ("%d %d", &x, &y);
V[x].push_back (y);
V[y].push_back (x);
}
}
void dfs (int nod) {
viz[nod] = 1;
for (vector <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
if (!viz[*it])
T[*it] = nod, dfs (*it);
A[nod] = INF;
vector <int>::iterator it;
int fiu = -1;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (*it != T[nod] && A[*it] != INF)
if (A[nod] > A[*it] + 1)
A[nod] = A[*it] + 1, fiu = *it;
B[nod] = 0;
for (it = V[nod].begin (); it != V[nod].end (); it++)
if (*it != T[nod] && *it != fiu)
B[nod] = max (B[nod], B[*it] + 1);
if (B[nod] == X || (nod == 1 && B[nod] + A[nod] > X)) {
K++;
B[nod] = 0;
A[nod] = 0;
}
if (A[nod] != INF && B[nod] + A[nod] <= X)
B[nod] = 0;
}
int main () {
freopen ("salvare.in", "r", stdin);
freopen ("salvare.out", "w", stdout);
citire ();
int p = 1, u = n, mij, sol = 0;
while (p <= u) {
mij = (p + u) >> 1;
X = mij; K = 0; //X = 4;
memset (viz, 0, sizeof (viz));
dfs (1);
if (K <= k) {
sol = mij;
u = mij - 1;
}
else
p = mij + 1;
}
printf ("%d", sol);
return 0;
}