Cod sursa(job #131008)

Utilizator razvan2006razvan brezulianu razvan2006 Data 2 februarie 2008 21:02:16
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <cstdio>   
#include <vector>   
  
using namespace std;   
  
#define NMAX 100100   
#define MIN(a,b) (((a)<(b))?(a):(b))   
#define MAX(a,b) (((a)>(b))?(a):(b))   
#define pb push_back   
  
vector<long long> C[NMAX];   
vector<int> A[NMAX];   
int N, K, MinK, X[NMAX], F[NMAX], tata[NMAX];   
long long BIG, Cmin, lo, hi, md, cost[NMAX], B[NMAX], V[NMAX], U[NMAX], INF;   
  
void dfs(int i)   
{   
        int j, n = A[i].size();   
  
        F[i] = 1;   
        for (j = 0; j < n; j++)   
            if (!F[ A[i][j] ])   
            {   
                tata[ A[i][j] ] = i;   
                cost[ A[i][j] ] = C[i][j];   
                dfs(A[i][j]);   
            }   
}   
  
void _try(int i)   
{   
        int j, n = A[i].size();   
  
        F[i] = 1;   
        for (j = 0; j < n; j++)   
            if (!F[ A[i][j] ]) _try(A[i][j]);   
  
        for (j = 0; j < n; j++)   
        if (tata[i]!=A[i][j])   
        {   
            V[i] = MAX(V[i], V[ A[i][j] ]+1);   
            U[i] = MIN(U[i], U[ A[i][j] ]+1);   
        }   
  
        if (md-U[i]>=V[i]) V[i] = -INF;   
        else  
        if (V[i]+cost[i]<=md);   
        else  
        {   
                U[i] = 0; V[i] = -INF;   
                MinK++;   
                X[i] = 1;   
        }   
}   
  
int main()   
{   
        int i, j, k, nf=0, t;   
        long long a = 1000000000, b = 1000000;   
  
        BIG = a*b;   
  
        freopen("salvare.in", "r", stdin);   
        freopen("salvare.out", "w", stdout);   
           
        scanf("%d%d", &N, &K);   
        for (t = 1; t <= N; t++) B[t] = 1;   
        for (t = 1; t < N; t++)   
        {   
                scanf("%d%d", &i, &j); k = 1;   
                A[i].pb(j); A[j].pb(i); C[i].pb(k); C[j].pb(k);   
        }   
  
        dfs(1);   
  
        INF = ((BIG+1)<<1);   
        cost[1] = INF*4;   
        md = BIG>>1;   
        for (lo = 1, hi = BIG; lo <= hi; md = (lo+hi)>>1)   
        {   
                for (i = 1; i <= N; i++)   
                    V[i] = X[i] = F[i] = 0, U[i] = INF;   
                MinK = 0;   
                _try(1);   
                if (MinK <= K) hi = md-1, Cmin = md;   
                else lo = md+1;   
        }   
  
        md = Cmin;   
        for (i = 1; i <= N; i++) V[i] = X[i] = F[i] = 0, U[i] = INF;   
        MinK = 0;   
        _try(1);   
  
        for (i = 1; i <= N && MinK < K; i++)   
            if (!X[i]) X[i] = 1, MinK++;   
  
        printf("%lld\n", Cmin);   
        for (i = 1; i <= N; i++)   
            if (X[i]) printf("%d ", i);   
        printf("\n");   
  
        return 0;   
           
}