Pagini recente » Cod sursa (job #572831) | Cod sursa (job #1715343) | Cod sursa (job #1652848) | Cod sursa (job #2753200) | Cod sursa (job #171332)
Cod sursa(job #171332)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int MAXN = 10001;
int N, M;
vector<int> ADJ[MAXN];
void read(){
ifstream fin("salvare.in");
fin >> N >> M;
int a, b;
for(int i = 0; i + 1 < N; i++){
fin >> a >> b;
ADJ[a].push_back(b);
ADJ[b].push_back(a);
}
}
vector<int> getSol(int dmax){
queue<int> q;
set<int> adj[MAXN];
int mmin[MAXN];
bool was[MAXN];
vector<int> ret;
for(int i = 1; i <= N; i++) {
mmin[i] = dmax;
was[i] = 0;
for(int j = 0; j < ADJ[i].size(); j++) adj[i].insert(ADJ[i][j]);
if(adj[i].size() == 1){
q.push(i);
was[i] = 1;
}
}
while(q.size() > 0){
int c = q.front(); q.pop();
// cout << c << endl;
if(adj[c].size() == 0) {
if(mmin[c] == 0) ret.push_back(c);
continue;
}
int nb = *adj[c].begin();
int nmmin = mmin[c] - 1;
// cout << mmin[c] << " " << nb << endl;
if(mmin[c] == 0) {
ret.push_back(c);
nmmin = 3 * dmax;
}
adj[nb].erase(c);
if(adj[nb].size() <= 1 && !was[nb]) {
was[nb] = 1;
q.push(nb);
}
if(mmin[nb] > nmmin) mmin[nb] = nmmin;
}
return ret;
}
void doit(){
int lo = 0, hi = N;
int best = 100000;
vector<int> sol;
vector<int> bestSol;
while(lo < hi){
int m = (lo + hi) >> 1;
sol = getSol(m);
if(sol.size() > M) lo = m + 1;
if(sol.size() < M) {
hi = m - 1, best = m;
bestSol.clear();
bestSol.insert(bestSol.begin(), sol.begin(), sol.end());
}
}
ofstream fout("salvare.out");
fout << best << endl;
bool was[MAXN];
memset(was, 0, N+1);
int i;
for(i = 0; i < bestSol.size(); i++) {
was[bestSol[i]] = 1;
fout << bestSol[i] << " ";
M--;
}
for(i = 1; i <= N && M; i++){
if(!was[i]) {
fout << i << " ";
M--;
}
}
fout.close();
}
int main() {
read();
doit();
return 0;
}