題意:給定一個具有樹性質的圖(其實就是無向無環圖),若把某一個節點作爲樹的根節點,則每個樹都有一個高度。求最小高度樹對應的根節點。
解法:每一次遍歷,把葉子節點都剪掉,留到最後的1——2個節點就是答案。
代碼:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges)
{
vector<int> du(n,0);
map<int,set<int>> e;
vector<bool> isUsed(n,false);
int i,j,k=0,ok,x;
for(i=0; i<edges.size(); i++)
{
du[edges[i].first]++;
du[edges[i].second]++;
e[edges[i].first].insert(edges[i].second);
e[edges[i].second].insert(edges[i].first);
}
while(true)
{
vector<int> one;
if(n-k<=2) break;
for(i=0; i<n; i++)
{
if(du[i]==1)
{
isUsed[i]=true;
k++;
one.push_back(i);
}
}
for(i=0;i<one.size();i++)
{
du[one[i]]--;
du[*(e[one[i]].begin())]--;
e[*(e[one[i]].begin())].erase(one[i]);
}
}
vector<int> ans;
for(i=0;i<n;i++)
{
if(isUsed[i]==false)
{
ans.push_back(i);
}
}
return ans;
}