Pagini recente » Cei mai harnici utilizatori info-arena | Cod sursa (job #1077448) | Cod sursa (job #2568515) | Cod sursa (job #2703099) | Cod sursa (job #1729600)
#include<cstdio>
#include<vector>
using namespace std;
vector<int> g[1010];
int grad[1010],d[1010],persgrad[1010],vc[1010],n;
struct cerere{int nod,dist;};
cerere aux,q[1010];
int verif(int m){
int i,left=1,right=0,dim,nr=0;
for(i=1;i<=n;i++){
grad[i]=persgrad[i];
vc[i]=1;
d[i]=20000000;
if(grad[i]==1){
aux.nod=i;
aux.dist=m;
right++;
q[right]=aux;
vc[i]=0;
}
}
while(left<=right){
dim=g[q[left].nod].size();
for(i=0;i<dim;i++)
if(vc[g[q[left].nod][i]]==1){
grad[g[q[left].nod][i]]--;
if(q[left].dist-1<d[g[q[left].nod][i]])
d[g[q[left].nod][i]]=q[left].dist-1;
if(grad[g[q[left].nod][i]]==1){
if(d[g[q[left].nod][i]]==0){
nr++;
aux.nod=g[q[left].nod][i];
aux.dist=2*m+1;
right++;
q[right]=aux;
}
else{
aux.nod=g[q[left].nod][i];
aux.dist=d[g[q[left].nod][i]];
right++;
q[right]=aux;
}
vc[i]=1;
}
}
left++;
}
return nr;
}
int main(){
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
int k,i,x,y,l1=1,l2,m,elem=2000000;
scanf("%d%d",&n,&k);
l2=n;
for(i=1;i<=n-1;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
persgrad[x]++;
persgrad[y]++;
}
while(l1<=l2){
m=(l1+l2)/2;
if(verif(m)<=k){
if(m<elem)
elem=m;
l2=m-1;
}
else
l1=m+1;
}
printf("%d",elem);
return 0;
}