Pagini recente » Cod sursa (job #89010) | Cod sursa (job #2171652) | Cod sursa (job #2417888) | Cod sursa (job #235021) | Cod sursa (job #2246830)
#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)
marked[node] = true;
else if (dist[node] == -1)
dist[node] = currDist;
}
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;
if (V == K) {
fout << 0 << '\n';
for (int node = 1; node <= V; ++node)
fout << node << ' ';
return 0;
}
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 << ' ';
}