Cod sursa(job #1729600)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 iulie 2016 11:40:32
Problema Salvare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<cstdio>
#include<vector>
using namespace std;
vector<int> g[1010];
int grad[1010],d[1010],persgrad[1010],vc[1010],n;
struct cerere{int nod,dist;};
cerere aux,q[1010];
int verif(int m){
    int i,left=1,right=0,dim,nr=0;
    for(i=1;i<=n;i++){
        grad[i]=persgrad[i];
        vc[i]=1;
        d[i]=20000000;
        if(grad[i]==1){
            aux.nod=i;
            aux.dist=m;
            right++;
            q[right]=aux;
            vc[i]=0;
        }
    }
    while(left<=right){
        dim=g[q[left].nod].size();
        for(i=0;i<dim;i++)
            if(vc[g[q[left].nod][i]]==1){
                grad[g[q[left].nod][i]]--;
                if(q[left].dist-1<d[g[q[left].nod][i]])
                    d[g[q[left].nod][i]]=q[left].dist-1;
                if(grad[g[q[left].nod][i]]==1){
                    if(d[g[q[left].nod][i]]==0){
                        nr++;
                        aux.nod=g[q[left].nod][i];
                        aux.dist=2*m+1;
                        right++;
                        q[right]=aux;
                    }
                    else{
                        aux.nod=g[q[left].nod][i];
                        aux.dist=d[g[q[left].nod][i]];
                        right++;
                        q[right]=aux;
                    }
                    vc[i]=1;
                }
            }
        left++;
    }
    return nr;
}
int main(){
    freopen("salvare.in","r",stdin);
    freopen("salvare.out","w",stdout);
    int k,i,x,y,l1=1,l2,m,elem=2000000;
    scanf("%d%d",&n,&k);
    l2=n;
    for(i=1;i<=n-1;i++){
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
        persgrad[x]++;
        persgrad[y]++;
    }
    while(l1<=l2){
        m=(l1+l2)/2;
        if(verif(m)<=k){
            if(m<elem)
                elem=m;
            l2=m-1;
        }
        else
            l1=m+1;
    }
    printf("%d",elem);
    return 0;
}