Pagini recente » Cod sursa (job #3273746) | Cod sursa (job #1946837) | Cod sursa (job #2029436) | Cod sursa (job #1133164) | Cod sursa (job #171351)
Cod sursa(job #171351)
#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);
}
}
void read2(){
ifstream fin("salvare.in");
fin >> N >> M;
for(int i = 1; i <= N; i++){
int cn; fin >> cn;
int v;
for(int j = 0; j < cn; j++) {
fin >> v;
ADJ[v].push_back(i);
ADJ[i].push_back(v);
}
}
}
vector<int> getSol(int dmax){
queue<int> q;
set<int> adj[MAXN];
int mmin[MAXN];
bool was[MAXN];
vector<int> ret;
bool isSol[MAXN];
if(dmax == 0){
for(int i = 1; i <= N; i++)
ret.push_back(i);
return ret;
}
for(int i = 1; i <= N; i++) {
mmin[i] = dmax;
was[i] = 0;
isSol[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 << "scot " << c << endl;
if(adj[c].size() == 0) continue;
int nb = *adj[c].begin();
adj[nb].erase(c);
if(adj[nb].size() <= 1 && !was[nb]) {
was[nb] = 1;
q.push(nb);
}
if(mmin[c] == 3 * dmax || mmin[nb] > mmin[c] - 1) mmin[nb] = mmin[c] - 1;
if(mmin[nb] == 0) {
if(!isSol[nb]) {
ret.push_back(nb);
isSol[nb] = 1;
}
mmin[nb] = 3 * dmax;
}
}
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;
M--;
}
for(i = 1; i <= N && M; i++){
if(!was[i]) {
bestSol.push_back(i);
M--;
}
}
sort(bestSol.begin(), bestSol.end());
for(i = 0; i < bestSol.size(); i++) fout << bestSol[i] << " ";
fout.close();
}
int main() {
read();
doit();
//vector<int> sol = getSol(0);
//for(int i = 0; i < sol.size(); i++) cout << sol[i] << " " ;
return 0;
}