Pagini recente » Cod sursa (job #2475541) | Cod sursa (job #472973) | Cod sursa (job #1887155) | Cod sursa (job #1228226) | Cod sursa (job #1513899)
#include <fstream>
#include <vector>
using namespace std;
const int inf = (1<<29);
const int nmax = 1005;
int n, k;
vector<int> g[nmax];
bool viz[nmax], s[nmax];
int d[nmax], limit, used;
ifstream fin ("salvare.in");
ofstream fout ("salvare.out");
void dfs(int dad)
{
int son;
viz[dad]=true;
d[dad]=-inf;
int dim=0, minn=inf;
for(int i=0; i<g[dad].size(); i++)
{
son=g[dad][i];
if(!viz[son])
{
dim++;
dfs(son);
minn=min(minn, d[son]+1);
if (!s[dad] && d[son]>limit)
{
++used;
d[dad]=d[dad]-limit-1;
s[dad]=true;
}
else if(!s[dad]) d[dad]=max(d[dad], d[son]+1);
}
}
if(!s[dad] && -(minn+1)>=d[dad]) d[dad]=minn;
if(dim==0) d[dad]=0;
}
bool test(int x)
{
for(int i=1; i<=n; i++)
viz[i]=s[i]=false;
limit=x;
used=0;
dfs(1);
if (d[1]>=0)
{
++used;
s[1]=true;
}
if (used<=k) return true;
return false;
}
void case_1()
{
fout << 0 << '\n';
for (int i=1; i<=n; i++)
fout << 1 << ' ';
fout << '\n';
}
void case_2()
{
int step = 1 << 10, sol, i, know;
for(sol=step+1; step; step=step>>1)
if(sol-step>0 && test(sol-step))
sol=sol-step;
fout << sol << '\n';
test(sol);
know=k-used;
for(i=1; know && i<=n; i++)
if (!s[i])
{
s[i]=true;
know--;
}
for(i=1; i<=n; i++)
if (s[i])
fout << i << ' ';
fout << '\n';
}
int main()
{
int i, x, y;
fin >> n >> k;
for (i=1; i<=n; i++)
{
fin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
if (k>=n) case_1();
else case_2();
fin.close();
fout.close();
return 0;
}