Pagini recente » Cod sursa (job #268539) | Cod sursa (job #1275972) | Cod sursa (job #1882047) | Cod sursa (job #1883076) | Cod sursa (job #1537874)
#include <fstream>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
ifstream f("salvare.in");
int N,K;
queue <int> Q;
vector <int> G[100005];
vector <int> Sol;
int Dist[100005],Use[100005],Father[100005],Grade[100005],Use2[100005],Grade2[100005],sol;
const int INF = 0x3f3f3f3f;
int Leaf[100005];
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;
Sol.push_back(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(Use2[i]==0)
{
++number;
Sol.push_back(i);
}
}
sort(Sol.begin(),Sol.end());
for(int i=0;i<Sol.size();i++)
printf("%d ",Sol[i]);
printf("\n");
}
int main()
{
freopen("salvare.out","w",stdout);
Read();
K=min(K,N);
DFS(1,0);
int left=0,right=100000,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;
}
printf("%d\n",sol);
for(int i=1;i<=N;i++)
Use[i]=0,Grade[i]=Grade2[i];
BFS(sol);
/*for(int i=1;i<=K;i++)
g<<i<<" ";
g<<"\n";*/
return 0;
}