题目
-
题目:对于一个具有树特征的无向图,我们可选择任何一个节点作为根,在所有可能的树中,具有最小高度的树被称为最小高度树。
-
输入:无向图
-
输出:最小高度树根节点
题解
- 多起点拓扑排序,从所有叶子节点开始,一层一层的删除节点(每次把一层的所有叶子节点的相邻节点的入度-1),最后剩下的入度<=1的节点都可以作为根节点。
- 最后剩下几个根节点?一定只有两个以内,因为图是连通图,两个以上必然存在大于1的入度
class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
if(n==1) return {0};
vector<int>res;
vector<int> v[n];
vector<int> ind(n);
for(auto edge:edges){
v[edge[0]].push_back(edge[1]);
v[edge[1]].push_back(edge[0]);
ind[edge[0]]++;
ind[edge[1]]++;
}
queue<int> q;
for(int i = 0;i < n;i++){
if(1==ind[i])
q.push(i);
}
while(n>2){
int num = q.size();
n-=num;
while(num--){
int tmp = q.front();
q.pop();
int t = v[tmp].size();
for(int i = 0;i < t;i++){
ind[v[tmp][i]]--;
if(ind[v[tmp][i]]==1) q.push(v[tmp][i]);
}
}
}
while(!q.empty()){
res.push_back(q.front());
q.pop();
}
return res;
}
};