Pagini recente » Cod sursa (job #2839160) | Cod sursa (job #3197467) | Cod sursa (job #3163693) | Cod sursa (job #1997651) | Cod sursa (job #2390488)
#include <cstdio>
#include <bitset>
#include <vector>
#include <cstring>
#include <algorithm>
#define DIMN 1001
#define INF 2000000000
using namespace std;
int elem,salv[DIMN],d[DIMN],k,n;
bitset <DIMN> f;
vector <int> v[DIMN];
void dfs (int nod,int x){
int i,vecin,maxi,mini;
maxi=0;
mini=INF;
f[nod]=1;
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (f[vecin]==0){
dfs(vecin,x);
maxi=max(maxi,d[vecin]+1);
mini=min(mini,d[vecin]+1);
}
}
d[nod]=maxi;
if (maxi==x){
salv[++elem]=nod;
d[nod]= -x-1;
}
else if (mini<0 && 0>=maxi+mini+1){
d[nod]=mini;
}
}
int verif (int x){
elem=0;
f.reset();
for (int i=1;i<=n;i++)
d[i]=0;
dfs (1,x);
if (d[1]>=0)
salv[++elem]=1;
return elem<=k;
}
int main()
{
FILE *fin=fopen ("salvare.in","r");
FILE *fout=fopen ("salvare.out","w");
int i,x,y,st,dr,mid,add,p;
fscanf (fin,"%d%d",&n,&k);
for (i=1;i<n;i++){
fscanf (fin,"%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
if (k==n){
fprintf (fout,"0\n");
for (i=1;i<=n;i++)
fprintf (fout,"%d ",i);
return 0;
}
st=1;
dr=n;
while (st<=dr){
mid=(st+dr)/2;
if (verif (mid))
dr=mid-1;
else st=mid+1;
}
verif (st);
fprintf (fout,"%d\n",st);
f.reset();
for (i=1;i<=elem;i++)
f[salv[i]]=1;
add=k-elem;
p=1;
while (add){
if (!f[p]){
salv[++elem]=p;
add--;
}
p++;
}
sort (salv+1,salv+elem+1);
for (i=1;i<=elem;i++)
fprintf (fout,"%d ",salv[i]);
return 0;
}