Pagini recente » Cod sursa (job #904244) | Cod sursa (job #1378397) | Cod sursa (job #1294651) | Cod sursa (job #1060882) | Cod sursa (job #168516)
Cod sursa(job #168516)
#include <fstream>
#include <vector>
using namespace std;
#define FILEIN "salvare.in"
#define FILEOUT "salvare.out"
#define MAX(A,B) ((A)>(B)?(A):(B))
#define INF -10000000
void dfs(int node, vector<vector <int> > &data, vector<int> &visited,
vector<int> &cost, vector<int> &taken, int &aux, int &mid) {
visited[node]=1;
if (data[node].size()==1 && node!=1) {
cost[node]=0;
taken[node]=-1;
return;
}
for (vector<int>::iterator it=data[node].begin(); it!=data[node].end(); it++) {
if (!visited[*it]) {
taken[*it]=taken[node]-1;
dfs(*it, data, visited, cost, taken, aux, mid);
cost[node]=MAX(cost[node],cost[*it]+1);
}
}
if (cost[node]<=taken[node])
cost[node]=-taken[node]-1;
if (cost[node]==mid) {
aux++;
cost[node]=-mid-1;
taken[node]=mid;
}
}
int main() {
int N, K;
int a, b, mid, aux;
vector<vector <int> > data;
vector<int> visited, cost, taken;
ifstream fin(FILEIN,ios::in);
ofstream fout(FILEOUT,ios::out);
fin >> N >> K;
for (int i=0; i<=N; i++) {
data.push_back(vector<int>());
visited.push_back(0);
taken.push_back(0);
cost.push_back(0);
}
for (int i=1; i<N; i++) {
fin >> a >> b;
data[a].push_back(b);
data[b].push_back(a);
}
fin.close();
if (K>=N) {
fout << 0 << endl;
for (int i=1; i<=N; i++)
fout << i;
fout.close();
return 0;
}
a=1;
b=N;
mid=(a+b)/2;
while (!(a==b || a==mid)) {
aux=0;
mid=(a+b)/2;
for (int i=1; i<=N; i++) {
visited[i]=0;
cost[i]=INF;
taken[i]=-1;
}
dfs(1, data, visited, cost, taken, aux, mid);
if (cost[1]>=0 && taken[1]<cost[1]) {
aux++;
cost[1]=-mid-1;
}
if (aux>K)
a=mid+1;
else
b=mid;
}
fout << mid << endl;
int count=0;
for (int i=1; i<=N; i++) {
if (cost[i]==(-mid-1)) {
fout << i << " ";
count++;
}
}
if (count<K) {
for (int i=1; i<=N; i++) {
if (cost[i]!=(-mid-1)) {
fout << i << " ";
count++;
if (count==K)
break;
}
}
}
fout.close();
return 0;
}