Cod sursa(job #991494)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 30 august 2013 16:35:31
Problema Salvare Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define NMax 1005
#define LogMax 11
using namespace std;
typedef vector <int> :: iterator vii; vector <int> T[NMax], Node, SC;int N, M, Level[NMax], A[LogMax][NMax], Log[NMax], V[NMax], S;bool IsC[NMax]; inline bool Compare (const int &a, const int &b){    return Level[a]>Level[b];} inline void DFS (int X, int F){    Level[X]=Level[F]+1; A[0][X]=F;    for (vii Y=T[X].begin (); Y!=T[X].end (); ++Y)    {        if (*Y!=F) DFS (*Y, X);    }} void BuildLog (){    for (int i=2; i<=N; ++i) Log[i]=Log[i/2]+1;} void BuildA (){    BuildLog ();    for (int i=1; i<=Log[N]; ++i)    {        for (int X=1; X<=N; ++X)        {            A[i][X]=A[i-1][A[i-1][X]];        }    }} inline int FindA (int X, int K){    int Y=X;    for (int Step=Log[N]; Step>=0; --Step)    {        if ((1<<Step)<=K) K-=(1<<Step), Y=A[Step][Y];    }    if (!Y) Y=1;    return Y;} inline void MarkDFS (int X, int K){    if (!K) return;    V[X]=K;    for (vii Y=T[X].begin (); Y!=T[X].end (); ++Y)    {        if (K-1>V[*Y]) MarkDFS (*Y, K-1);    }} inline bool Possible (int K){    memset (V, 0, sizeof (V));    vector <int> Center;    for (vii X=Node.begin (); X!=Node.end (); ++X)    {        if (!V[*X]) Center.push_back (FindA (*X, K)), MarkDFS (FindA (*X, K), K+1);        if ((int)Center.size ()>M) return false;    }    S=K; SC=Center;    return true;} void BSearch (){    int L=0, R=N/M+1;    while (L<=R)    {        int Mid=(L+R)/2;        if (Possible (Mid)) R=Mid-1;        else L=Mid+1;    }} void BuildS (){    for (vii X=SC.begin (); X!=SC.end (); ++X) IsC[*X]=true, --M;    for (int X=1; X<=N; ++X)    {        if (M and !IsC[X]) SC.push_back (X), --M;    }    sort (SC.begin (), SC.end ());} void Solve (){    DFS (1, 0); Level[0]=-N;    sort (Node.begin (), Node.end (), Compare);    BuildA ();    BSearch ();    BuildS ();} void Read (){    freopen ("salvare.in", "r", stdin);    scanf ("%d\n%d", &N, &M);    for (int X=1; X<=N; ++X) Node.push_back (X);    for (int i=1; i<N; ++i)    {        int X, Y; scanf ("%d %d", &X, &Y);        T[X].push_back (Y); T[Y].push_back (X);    }} void Print (){    freopen ("salvare.out", "w", stdout);    printf ("%d\n", S);    for (vii X=SC.begin (); X!=SC.end (); ++X)    {        printf ("%d ", *X);    }    printf ("\n");} int main (){    Read ();    Solve ();    Print ();    return 0;}