Pagini recente » Cod sursa (job #1613773) | Cod sursa (job #2252962) | Cod sursa (job #1602403) | Cod sursa (job #23959) | Cod sursa (job #2245988)
#include <fstream>
#include <list>
#include <bitset>
#include <algorithm>
#include <vector>
#include <climits>
using namespace std;
const int maxV = 1000;
const int Inf = INT_MAX;
ifstream fin("salvare.in");
ofstream fout("salvare.out");
list <int> adjList[1 + maxV];
bitset <1 + maxV> marked;
bitset <1 + maxV> sol;
vector <int> dist;
int V, E, K;
void resizeVectors(){
dist.resize(1 + V);
}
void DFS(int node, int father, int currDist){
for(const int &nextNode : adjList[node])
if(nextNode != father){
DFS(nextNode, node, currDist);
dist[node] = min(dist[node], dist[nextNode] - 1);
}
if(adjList[node].size() == 1)
dist[node] = currDist;
else if(dist[node] == 0){
dist[node] = currDist;
marked[node] = true;
}
}
inline int check(const int &currDist){
fill(dist.begin(), dist.end(), Inf);
marked.reset();
DFS(1, 0, currDist);
int usedNodes = 0;
for(int node = 1; node <= V; ++node)
if(marked[node])
++usedNodes;
return usedNodes;
}
int main(){
fin >> V >> K;
E = V - 1;
resizeVectors();
for(; E; --E){
int from, to;
fin >> from >> to;
adjList[from].push_back(to);
adjList[to].push_back(from);
}
int low = 1, high = V - 1;
int ans = 0, usedNodes = 0;
while(low <= high){
int mid = (low + high) / 2;
int checker = check(mid);
if(checker <= K){
ans = mid;
usedNodes = checker;
high = mid - 1;
for(int node = 1; node <= V; ++node)
sol[node] = marked[node];
}
else low = mid + 1;
}
fout << ans << '\n';
K -= usedNodes;
for(int node = 1; K; ++node)
if(!sol[node]){
sol[node] = true;
--K;
}
for(int node = 1; node <= V; ++node)
if(sol[node] == true)
fout << node << ' ';
}