给一树,求以那些点为跟树的高度最小
思路:(bfs)
任选点p找出最远点x,
从x找出最远点y,
xy即为最长路径,其中点即为答案。
int findLongestNode(int u, vector<int> & parent, vector<vector<int>>& adj) {
int n = adj.size();
queue<int> qu;qu.emplace(u);
vector<bool> visit(n);visit[u] = true;
int node = -1;
while (!qu.empty()) {
int curr = qu.front();qu.pop();
node = curr;
for (auto & v : adj[curr]) {
if (!visit[v]) {
visit[v] = true;
parent[v] = curr;
qu.emplace(v);
}
}
}
return node;
}
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
if (n == 1) return {0};
vector<vector<int>> adj(n);
for (auto & edge : edges) {
adj[edge[0]].emplace_back(edge[1]);
adj[edge[1]].emplace_back(edge[0]);
}
vector<int> parent(n, -1);
int x = findLongestNode(0, parent, adj);
int y = findLongestNode(x, parent, adj);
vector<int> path;
parent[x] = -1;
while (y != -1) {
path.emplace_back(y);
y = parent[y];
}
int m = path.size();
if (m % 2 == 0)return {path[m / 2 - 1], path[m / 2]};
else return {path[m / 2]};
}