Pagini recente » Autentificare | Cod sursa (job #164857) | Arhiva de probleme | Cod sursa (job #333418) | Cod sursa (job #374069)
Cod sursa(job #374069)
#include <cstdio>
#include <vector>
#include <deque>
#define NMAX 1003
using namespace std;
vector <int> v[NMAX];
vector <int> sol;
deque <int> fr;
int nv[NMAX],ind[NMAX],grad[NMAX],n,k;
int luat[NMAX];
void citire()
{
FILE *fin=fopen("salvare.in","r");
fscanf(fin,"%d %d",&n,&k);
int i;
for (i=1;i<n;++i)
{ int x,y;
fscanf(fin,"%d %d",&x,&y);
v[x].push_back(y); v[y].push_back(x);
}
for (i=1;i<=n;++i) nv[i]=v[i].size();
fclose(fin);
}
int main()
{
citire();
if (k==n) { FILE *fout=fopen("salvare.out","w");
fprintf(fout,"0\n");
for (int i=1;i<=n;++i)fprintf(fout,"%d ",i);
fclose(fout);
return 0;
}
int ls,ld,MIN,m,nl,i,r;
ls=1;ld=n;
MIN=n+2;
while (ls<=ld)
{
m=(ld+ls)/2; //caut binar k
memset(luat,0,sizeof(luat));
nl=0; r=n; fr.clear();
for (i=1;i<=n;++i)
{ if (nv[i]==1) { fr.push_back(i); luat[i]=1; r--;}
grad[i]=nv[i]; ind[i]=m;
}
while (fr.size()>1 && r)
{
int x=fr.front(); fr.pop_front();
for (i=0;i<nv[x];++i)
if (!luat[v[x][i]])
{ int p=v[x][i];
ind[p]=min(ind[p],ind[x]-1);
grad[p]--;
if (grad[p]<=1)
{
fr.push_back(p);
if (ind[p]==0) {luat[p]=2; ind[p]=m+1; nl++;}
else luat[p]=1;
r--;
}
}
}
if (fr.size()==2)
{
int x=fr.front(),y=fr.back();
if (luat[x]==2 || luat[y]==2) fr.clear();
else //niciuna nu e salvare
{
/*fr.pop_front();
ind[y]=min(ind[y],ind[x]-1);
if (ind[y]==0) {luat[y]=2; nl++;}*/
fr.clear(); luat[y]=2; nl++;
}
}
if (fr.size()==1 && luat[fr.front()]<2) {luat[fr.front()]=2; nl++;}
if (nl>k) { ls=m+1;}
else
{
ld=m-1;
MIN=m;
sol.clear();
for (i=1;i<=n;++i)
if (luat[i]==2) sol.push_back(i);
}
}
FILE *fout=fopen("salvare.out","w");
fprintf(fout,"%d\n",MIN);
i=0; int x=1;
while (nl<k && i<sol.size() && x<=sol.back())
{
while (i<sol.size() && x<sol[i] && nl<k)
{fprintf(fout,"%d ",x); x++; nl++;}
fprintf(fout,"%d ",sol[i]);
x++; i++;
}
while (nl<k)
{
while (x<=sol.back()) x++;
fprintf(fout,"%d ",x); x++; nl++;
}
while (i<sol.size()) {fprintf(fout,"%d ",sol[i]); i++;}
fclose(fout);
return 0;
}