Cod sursa(job #57546)

Utilizator mariusdrgdragus marius mariusdrg Data 2 mai 2007 15:31:45
Problema Salvare Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#define vi vector <int>
#define pb push_back
#define vii vector <int> :: iterator

using namespace std;

const int maxn = 2010;

int i;
int k;
vi vect1;
int x;
int y;
int j;
int n;
vi vect[maxn];
int ver[maxn];
int dist[maxn];
int niv[maxn];
int num;
int l;


void dfs(int i,int prop)
{
        vii it;
        for(it = vect[i].begin();it != vect[i].end();++it)
        {
                int x = *it;
                if (ver[*it] == 0)
                {
                        ver[*it] = i;
                        dfs(*it,prop);
                }
        }
        dist[i] = 1000000;
        for(it = vect[i].begin();it != vect[i].end(); ++it)
        {
                int x = *it;
                if (ver[i] == *it) continue;
                niv[i] = max(niv[*it] + 1,niv[i]);
                dist[i] = min(dist[*it] + 1,dist[i]);
        }
 /*       if (dist[i] == 1000000)
        {
                dist[i] = 0;
        }  */
        if (niv[i] >= l)
        {
                ++num;
                dist[i] = 0;
                niv[i] = 0;
                if (prop == 1) vect1.pb(i);
        }
        if (dist[i] + niv[i] < l)
        {
                dist[i] = 0;
                niv[i] = 0;
        }
}


int veri(int x,int prop)
{
        num = 0;
        l = x;
        for(i = 1;i <= n; ++i)
        {
                ver[i] = 0;
                niv[i] = 0;
                dist[i] = 0;
        }
        ver[1] = 1;
        dfs(1,prop);
        return num > k;
}


int main()
{
        freopen("salvare.in","r",stdin);
        freopen("salvare.out","w",stdout);
        scanf("%d %d",&n,&k);
        for(i = 1;i < n; ++i)
        {
                scanf("%d %d",&x,&y);
                vect[x].pb(y);
                vect[y].pb(x);
        }
        int p = 1;
        x = 0;
        for(p = 1;p <= n; p <<= 1);

        for(;p;p >>= 1)
        {
                if (veri(x + p, 0))
                {
                        x += p;
                }
        }
        if (x == 0 && veri(x,1))
        {
                x = -1;
        }
        veri(x + 1,1);
        int n1 = vect1.size();
        while (n1 < k)
        {
                int x = rand() % (n + 1);
                vect1.pb(x);
                n1++;
        }
        sort(vect1.begin(),vect1.end());
        vii it;
        printf("%d\n",x + 1);

        //        printf("%d\n",vect1.size());
        for(it = vect1.begin();it != vect1.end(); ++it)
        {
                printf("%d ",*it);
        }
        return 0;
}