Pagini recente » Cod sursa (job #56603) | Cod sursa (job #55402) | Cod sursa (job #2111926) | Cod sursa (job #1393854) | Cod sursa (job #55399)
Cod sursa(job #55399)
Utilizator |
Mircea Pasoi domino |
Data |
27 aprilie 2007 13:06:44 |
Problema |
Salvare |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.81 kb |
#include <stdio.h>
#include <queue>
#include <vector>
#include <string.h>
#define inf (int)1e9
#define nmax 1005
#define pb push_back
using namespace std;
typedef pair<int,int> ii;
int K,i,n1,n2,n,k,bag[nmax],grad[nmax],nod,scos[nmax],c[nmax];
vector <int> e[nmax];
ii aux;
priority_queue < ii,vector<ii>,greater<ii> > Q;
inline int max(int a,int b) {
if(a > b) return a;
else return b;
}
int salvari(int x) {
int i,K = 0,ultim = 0;
while(!Q.empty()) Q.pop();
for(i = 1; i <= n; i++) {
Q.push(ii(e[i].size(),i));
grad[i] = e[i].size();
}
memset(scos,0,sizeof(scos));
memset(bag,0,sizeof(bag));
for(i = 1; i <= n; i++) c[i] = -inf;
for(i = 1; i <= n; i++) if(grad[i] == 1) c[i] = 0;
while(!Q.empty()) {
aux = Q.top();
Q.pop();
if(aux.first == grad[aux.second]) {
nod = aux.second;
if(c[nod] == x) {
K++;
bag[nod] = 1;
c[nod] = - x - 1;
}
scos[nod] = 1;
for(i = 0; i < (int)e[nod].size(); i++)
if(!scos[e[nod][i]]) {
grad[e[nod][i]]--;
Q.push(ii(grad[e[nod][i]],e[nod][i]));
if(grad[e[nod][i]] == 0 && c[e[nod][i]] == 0) c[e[nod][i]] = -inf;
c[e[nod][i]] = max(c[e[nod][i]],c[nod] + 1);
}
ultim = nod;
}
}
if(c[ultim] >= 0) {
K++;
bag[ultim] = 1;
}
for(i = 1; (i <= n) && (K < k); i++)
if(!bag[i]) {
bag[i] = 1;
K++;
}
return K;
}
int cauta(int f,int l) {
int rez = inf;
while(f <= l) {
int mi = (f + l) / 2;
int x = salvari(mi);
if(x <= k) {
rez = mi;
l = mi - 1;
}
else f = mi + 1;
}
return rez;
}
int main() {
freopen("salvare.in","r",stdin);
freopen("salvare.out","w",stdout);
scanf("%d%d",&n,&k);
for(i = 1; i < n; i++) {
scanf("%d%d",&n1,&n2);
e[n1].pb(n2);
e[n2].pb(n1);
}
int x = cauta(0,n);
printf("%d\n",x);
salvari(x);
for(i = 1; i <= n; i++) if(bag[i]) printf("%d ",i); printf("\n");
return 0;
}