Pagini recente » Cod sursa (job #2772865) | Cod sursa (job #2819348) | Cod sursa (job #2554702) | Cod sursa (job #589821) | Cod sursa (job #1536344)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("salvare.in");
ofstream g("salvare.out");
int N,K;
queue <int> Q;
vector <int> G[1005];
int Dist[1005],Use[1005],sol;
const int INF = 0x3f3f3f3f;
vector <int> Sol;
int Leaf[1005];
void Read()
{
f>>N>>K;
for(int i=1;i<N;i++)
{
int x,y;
f>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
}
void DFS(int node,int father)
{
int number=0;
for(int i=0;i<G[node].size();i++)
{
int neighb=G[node][i];
if(neighb==father)
continue;
++number;
DFS(neighb,node);
}
if(number==0)
Leaf[++Leaf[0]]=node;
}
bool check(int value)
{
int Min=INF;
for(int i=1;i<=N;i++)
{
int ans=1;
for(int i=1;i<=N;i++)
Dist[i]=INF;
Dist[i]=value;
while(!Q.empty())
{
int node=Q.front();
Q.pop();
for(int i=0;i<G[node].size();i++)
{
int neighb=G[node][i];
if(Dist[neighb]==INF)
{
Dist[neighb]=Dist[node]-1;
if(Dist[neighb]==-1)
{
Dist[neighb]=value;
++ans;
}
Q.push(neighb);
}
}
}
Min=min(Min,ans);
}
if(Min<=K)
return 1;
return 0;
}
void BFS(int value)
{
int Min=INF;
for(int i=1;i<=N;i++)
{
int ans=1;
for(int i=1;i<=N;i++)
Use[i]=0;
Sol.clear();
Sol.push_back(i);
Use[i]=1;
for(int i=1;i<=N;i++)
Dist[i]=INF;
Dist[i]=value;
while(!Q.empty())
{
int node=Q.front();
Q.pop();
for(int i=0;i<G[node].size();i++)
{
int neighb=G[node][i];
if(Dist[neighb]==INF)
{
Dist[neighb]=Dist[node]-1;
if(Dist[neighb]==-1)
{
Dist[neighb]=value;
Sol.push_back(neighb);
Use[neighb]=1;
++ans;
}
Q.push(neighb);
}
}
}
Min=min(Min,ans);
if(ans<=K)
{
for(int i=0;i<Sol.size();i++)
g<<Sol[i]<<" ";
int number=Sol.size();
int j=1;
while(number<K)
{
for(;j<=N;j++)
{
if(Use[j]==0)
{
g<<j<<" ";
++number;
return;
}
}
}
}
}
}
int main()
{
Read();
int left=1,right=N,mid,sol=N;
while(left<=right)
{
mid=(left+right)/2;
if(check(mid)==1)
{
right=mid-1;
sol=mid;
}
else
left=mid+1;
}
g<<sol<<'\n';
BFS(sol);
return 0;
}