73. Minimum Height Trees

本文介绍了一种算法,用于解决在给定无向图中寻找所有最小高度树的问题。通过逐步去除叶子节点的方法,最终确定了树的根节点。文章提供了一个具体的C++实现示例。
  1. Minimum Height Trees My Submissions QuestionEditorial Solution
    Total Accepted: 12164 Total Submissions: 45386 Difficulty: Medium
    For a undirected graph with tree characteristics, we can choose any node as the root. The result graph is then a rooted tree. Among all possible rooted trees, those with minimum height are called minimum height trees (MHTs). Given such a graph, write a function to find all the MHTs and return a list of their root labels.

Format
The graph contains n nodes which are labeled from 0 to n - 1. You will be given the number n and a list of undirected edges (each edge is a pair of labels).

You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.

Example 1:

Given n = 4, edges = [[1, 0], [1, 2], [1, 3]]

    0
    |
    1
   / \
  2   3

return [1]

Example 2:

Given n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]

 0  1  2
  \ | /
    3
    |
    4
    |
    5

return [3, 4]

题意:
对于一棵无向树,我们可以选择它的任意节点作为根。得到的结果就是有根树。在所有可能的有根树中,高度最小的称为最小高度树(MHT)。给定一个无向图,编写函数找出所有的最小高度树,并返回其根标号的列表。

思路:逐步去掉相应的叶子节点,那么最后剩下的便是根节点(<=2)
如上图:1.去掉0,1,2,再去掉5

算法如下:
注意:尽量节省时间,否则很容易就time limited!!!!
以下的新一轮叶子节点尽量一次得到,不要再另外扫描,否则超时

class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
        int nsize=edges.size();
        set<int> ps;
        map<int,set<int>> mp;      //类似于邻接表
        for(int i=0;i<nsize;++i){
                mp[edges[i].first].insert(edges[i].second);
                mp[edges[i].second].insert(edges[i].first);
        }
        set<int> leaf;
        auto it = mp.begin();
        while(it!=mp.end()){
            if(it->second.size()==1)leaf.insert(it->first);  //第一次得到叶子节点集合
            ++it;
        }
        while(mp.size()>2){              //当剩下的节点数>2
            set<int> newleaf;
            auto it2 = mp.begin();
            while(it2!=mp.end()){
                if(leaf.count(it2->first)){          //如果当前节点在叶子节点
                    auto itbeg = (it2->second).begin();
                    auto itend = (it2->second).end();
                    while(itbeg!=itend){              //使得和叶子节点相邻的节点不再和叶子节点相连
                        mp[*itbeg].erase(it2->first);
                        if(mp[*itbeg].size()==1)newleaf.insert(*itbeg); //加入到新一轮的叶子节点
                        ++itbeg;
                    }
                    auto it2next = ++it2; //确保迭代器有效
                    --it2;
                    mp.erase(it2);      //删除叶子节点
                    it2 = it2next;
                }
                else ++it2;
            }
            leaf = newleaf;       //更新新一轮的叶子节点
        }
         vector<int> res;
         if(n==1){                //如果n==1要求直接返回0
             res.push_back(0);
             return res;
         }
         auto mit=mp.begin();
         while(mit!=mp.end()){
             res.push_back(mit->first);
             ++mit;
         }
         return res;
    }
};
AI-PPT 一键生成 PPT:用户输入主题关键词,AI-PPT 可快速生成完整 PPT,涵盖标题、正文、段落结构等,还支持对话式生成,用户可在 AI 交互窗口边查看边修改。 文档导入转 PPT:支持导入 Word、Excel、PDF 等多种格式文档,自动解析文档结构,将其转换为结构清晰、排版规范的 PPT,有保持原文和智能优化两种模式。 AI-PPT 对话 实时问答:用户上传 PPT 或 PPTX 文件后,可针对演示内容进行提问,AI 实时提供解答,帮助用户快速理解内容。 多角度内容分析:对 PPT 内容进行多角度分析,提供全面视野,帮助用户更好地把握内容结构和重点。 多语言对话支持:支持多语言对话,打破语言障碍,方便不同语言背景的用户使用。 AI - 绘图 文生图:用户输入文字描述,即可生成符合语义的不同风格图像,如油画、水彩、中国画等,支持中英文双语输入。 图生图:用户上传图片并输入描述,AI - 绘图能够根据参考图和描述生成新的风格化图像,适用于需要特定风格或元素的创作需求。 图像编辑:提供如 AI 超清、AI 扩图、AI 无痕消除等功能,用户可以上传图片进行细节修改和优化,提升图片质量。 AI - 文稿 文案生成:能够根据用户需求生成多种类型的文章,如市场营销文案、技术文档、内部沟通内容等,提升文案质量和创作效率。 文章润色:对已有文章进行改善和优化,包括语言表达、逻辑连贯性、内容流畅度等方面,使文章更符合用户期望和风格。 文章续写:AI 技术理解文本语境,为用户提供新的想法、补充资料或更深层次的见解,帮助用户丰富文档内容。 AI - 医生 智能健康咨询:包括症状自查,用户输入不适症状,AI 结合病史等信息提供疾病可能性分析与初步建议;用药指导,支持查询药品适应症、禁忌症等,并预警潜在冲突;中医辨证,提供体质辨识与调理建议。 医学报告解读:用户上传体检报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值