Cod sursa(job #1537056)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 26 noiembrie 2015 21:34:13
Problema Salvare Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#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;
}