Cod sursa(job #1536347)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 25 noiembrie 2015 23:54:58
Problema Salvare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.3 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],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;
        Q.push(i);
        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;
        Q.push(i);
        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 && number<K;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;
}