Cod sursa(job #1473303)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 18 august 2015 23:42:10
Problema Salvare Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <stdio.h>
#include <string.h>
#define MAXN 1000
int list[MAXN+1], lista[MAXN], urm[2*MAXN-1], m, k, next[MAXN+1], val[2*MAXN-1], r[MAXN+1], ok[MAXN+1], s[MAXN+1], n, t[MAXN+1];
void DFS(int nod, int h, int restrictie){
    int p=list[nod];
    ok[nod]=1;
    if(h>0){
        while(p){
            if(val[p]!=restrictie){
                DFS(val[p], h-1, nod);
            }
            p=urm[p];
        }
    }
}
inline int resq(int h){
    int ans, e, p, x, i, last;
    memset(s, 0, sizeof s);
    memset(ok, 0, sizeof ok);
    ans=0;
    for(e=n-1; e>=0; e--){
        p=lista[e];
        while(p){
            if(!ok[r[p]]){
                x=r[p];
                last=x;
                i=0;
                while((i<h)&&(!s[x])&&(x>1)){
                    i++;
                    ok[x]=1;
                    last=x;
                    x=t[x];
                }
                if(!s[x]){
                    ok[x]=1;
                    s[x]=1;
                    DFS(x, h, last);
                    ans++;
                }
            }
            p=next[p];
        }
    }
    return ans;
}
void dfs(int nod, int h){
    int p=list[nod];
    r[++k]=nod;
    next[k]=lista[h];
    lista[h]=k;
    while(p){
        if(val[p]!=t[nod]){
            t[val[p]]=nod;
            dfs(val[p], h+1);
        }
        p=urm[p];
    }
}
inline void adauga(int x, int y){
    val[++m]=y;
    urm[m]=list[x];
    list[x]=m;
}
int main(){
    int k, x, y, rez, pas, i;
    FILE *fin, *fout;
    fin=fopen("salvare.in", "r");
    fout=fopen("salvare.out", "w");
    fscanf(fin, "%d%d", &n, &k);
    for(i=1; i<n; i++){
        fscanf(fin, "%d%d", &x, &y);
        adauga(x, y);
        adauga(y, x);
    }
    t[1]=0;
    dfs(1, 0);
    rez=-1;
    for(pas=1<<9; pas; pas>>=1){
        if(resq(rez+pas)>k){
            rez+=pas;
        }
    }
    rez++;
    fprintf(fout, "%d\n", rez);
    x=resq(rez);
    for(i=1; i<=n; i++){
        k-=s[i];
    }
    for(i=1; i<=n; i++){
        if((!s[i])&&(k)){
            s[i]=1;
            k--;
        }
        if(s[i]){
            fprintf(fout, "%d ", i);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}