Pagini recente » Cod sursa (job #2304984) | Cod sursa (job #148072) | Cod sursa (job #1334731) | Cod sursa (job #1308042) | Cod sursa (job #1537056)
#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],Father[1005],Grade[1005],Use2[1005],Grade2[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;
++Grade[x];
++Grade[y];
G[x].push_back(y);
G[y].push_back(x);
}
}
void DFS(int node,int father)
{
int number=0;
Father[node]=father;
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 cnt=0;
for(int i=1;i<=N;i++)
Dist[i]=INF;
for(int i=1;i<=Leaf[0];i++)
{
Dist[Leaf[i]]=value-1;
Q.push(Leaf[i]);
Use[Leaf[i]]=1;
}
while(!Q.empty())
{
int node=Q.front();
Q.pop();
if(Dist[node]==-1)
{
Dist[node]=value;
++cnt;
}
int neighb=Father[node];
--Grade[neighb];
--Grade[node];
Dist[neighb]=min(Dist[neighb],Dist[node]-1);
if((Grade[neighb]==1 && neighb!=1) || (Grade[neighb]==0 && neighb==1))
{
Q.push(neighb);
Use[neighb]=1;
}
}
if(cnt<=K)
return 1;
return 0;
}
void BFS(int value)
{
int cnt=0;
for(int i=1;i<=N;i++)
Dist[i]=INF;
for(int i=1;i<=Leaf[0];i++)
{
Dist[Leaf[i]]=value-1;
Q.push(Leaf[i]);
}
while(!Q.empty())
{
int node=Q.front();
Q.pop();
if(Dist[node]==-1)
{
Dist[node]=value;
++cnt;
Use2[node]=1;
g<<node<<" ";
}
int neighb=Father[node];
--Grade[neighb];
--Grade[node];
Dist[neighb]=min(Dist[neighb],Dist[node]-1);
if((Grade[neighb]==1 && neighb!=1) || (Grade[neighb]==0 && neighb==1))
{
Q.push(neighb);
Use[neighb]=1;
}
}
int number=cnt;
for(int i=1;i<=N && number<K;i++)
{
if(Use[i]==0)
{
++number;
g<<i<<" ";
}
}
g<<"\n";
}
int main()
{
Read();
DFS(1,0);
int left=1,right=N,mid,sol=N;
for(int i=1;i<=N;i++)
Grade2[i]=Grade[i];
while(left<=right)
{
mid=(left+right)/2;
for(int i=1;i<=N;i++)
Grade[i]=Grade2[i],Use[i]=0;
if(check(mid)==1)
{
right=mid-1;
sol=mid;
}
else
left=mid+1;
}
g<<sol<<'\n';
for(int i=1;i<=N;i++)
Use[i]=0,Grade[i]=Grade2[i];
BFS(sol);
return 0;
}