Cod sursa(job #320256)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 4 iunie 2009 09:44:31
Problema Salvare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.99 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 = 10000000, b = 10000;
     
        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;      
              
}