Cod sursa(job #1644642)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 10 martie 2016 01:39:19
Problema Salvare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#define INF 1000000000
using namespace std;
vector<int>L[1010];
int n,k,m,i,j,a,b,p,u,mid,nr,v[1010],x[1010],sol[1010],y[1010];
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int maxim(int a,int b){
    if(a>b)
        return a;
    return b;
}
void dfs(int nod,int tata){
    int vmin = INF;
    v[i] = 1;
    for(int i=0;i<L[nod].size();i++){
        if( v[ L[nod][i] ] == 0 && L[nod][i] != tata ){
            dfs( L[nod][i] , nod );
            x[nod] = maxim( x[nod] , x[ L[nod][i] ] + 1 );
            vmin = minim( vmin , x[ L[nod][i] ] + 1 );
        }
    }
    if( x[nod] == a ){
        y[ ++b ] = nod;
        x[nod] = - a - 1;
        return;
    }
    if( vmin < 0 && - vmin - 1 >= x[nod] ){
        x[nod] = vmin;
    }
}
int verif( int val ){
    memset(y,0,sizeof(y));
    a = val;
    b = 0;
    dfs(1,0);
    if( x[1] >=0 )
        y[ ++ b ] = 1;
    return b<=k;
}
int main(){
    f=fopen("salvare.in","r");
    g=fopen("salvare.out","w");
    fscanf(f,"%d%d",&n,&k);
    for(i=1;i<=n;i++){
        fscanf(f,"%d%d",&a,&b);
        L[a].push_back(b);
        L[b].push_back(a);
    }
    p=1;
    u=n;
    while( p <= u ){
        mid = ( p + u ) / 2;
        if( verif( mid ) ){
            u = mid - 1;
            memcpy(sol,y,sizeof(sol));
            nr = mid;
        }
        else
            p = mid + 1;
    }
    fprintf(g,"%d\n",nr);
    sort(sol+1,sol+nr+1);
    memset(v,0,sizeof(v));
    for(i=1;i<=b;i++){
        v[ sol[i] ] = 1;
    }
    k -= b;
    for(i=1;i<=n;i++){
        if( v[i] )
            fprintf(g,"%d ",i);
        else if( k > 0 ){
            k--;
            fprintf(g,"%d ",i);
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}