Cod sursa(job #173655)

Utilizator floringh06Florin Ghesu floringh06 Data 7 aprilie 2008 22:05:55
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>    
  
using namespace std;  

#define FIN "salvare.in"
#define FOUT "salvare.out"  
#define MAX_N 1005  
  
#include <vector>  
  
vector <int> G[MAX_N];  
int N, K, H, d, s;

int A[MAX_N];
int g[MAX_N];
int C[MAX_N];

int index[MAX_N];
int B[MAX_N];  
  
    int solve(int x)  
    {  
        int i, j, ii, t = 0;  
        s = -1;  
        for (i = 0; i <= N - 1; ++i)
        {  
            g[i] = G[i].size();
            index[i] = 0, B[i] = x + 1, A[i] = x;  
            if(g[i] <= 1) 
                    index[i] = 2, C[++s] = i, A[i] = x;  
        }  
        for (d = 0; d <= s; ++d)
        {  
            i = C[d];  
            if(A[i] == 0) 
                    t++, index[i] = 1, B[i]=0;  
            for (ii = 0; ii <= G[i].size() - 1; ++ii)
            {  
                j = G[i][ii];  
                g[j]--;  
                if(g[j] <= 1 && !index[j]) 
                        C[++s]=j, index[j]=2;  
                if(B[i] > A[i]) 
                        A[j] = min(A[j], A[i]-1);  
            
                B[j] = min(B[j], B[i]+1);  
            }         
        }  
        if(A[C[s]] <=x && B[i] > A[i]) 
                   t++, index[ C[s] ]=1;  
        for (i = 0; i <= N - 1; ++i)
        {  
           if(K < t) return 0;
           if(K == t) return 1;  
           if(index[i] != 1) index[i] = 1, t++;  
        }  
    }  
  
    int main()  
    {  
        freopen(FIN, "r", stdin);  
        freopen(FOUT, "w", stdout);  
    
        scanf("%d %d", &N, &K);  
        int i, x, y;
        for (i = 1; i < N; ++i)
        {
            scanf("%d %d",&x, &y), --x, --y;
            G[x].push_back(y), G[y].push_back(x);  
        }
    
        for(i = 10; i >= 0; --i)  
            if(!solve(H + (1 << i))) H += 1 << i; solve(H + 1);  
    
        printf("%d\n", H + 1);  
        for (i = 0; i <= N - 1; ++i) if(index[i] == 1) printf("%d ",i + 1);  
    
        return 0;  
    }