【京东2019】紧急疏散(思路整理)

问题描述:https://www.nowcoder.com/practice/976164f3464145c486cbc855f1a60aae?sourceQid=23276&sourceTpId=265(怀疑是智商问题,读题读了好几遍才懂)

言归正传:根据示例:

6
2 1
3 2
4 3
5 2
6 1

我们可以画出如下的二叉树:
在这里插入图片描述
对于上述的输入关系,可以用vector存储表示为:
在这里插入图片描述
由题目,根节点1是唯一多人逃生出口,意在寻找节点1的最大子树节点个数;

此时从上往下计算的话,我们可以想到队列queue先进先出的特性,从1往下走,可以到2和6,而2又可以到1,5,3, 一步步往下计算最大个数,将已经计算过的节点标记为true,避免后续重复计数。

		q.push(tmp1[i]); //从1往下的第一个数
        int cnt = 0; //记录经过的节点
        while(!q.empty()) 
        {
            int p = q.front(); 
            cnt++;
            vis[p] = true; //将计算过的节点数设置为true
            for(int j = 0; j < tmp[p].size(); j++)
            {
                if(!vis[tmp[p][j]])
                    q.push(tmp[p][j]); //从上往下走时,当有未计算的数,将其压入栈中
            }
            q.pop(); //将记录过的节点出栈
         }
         r = max(r, cnt); //记录节点最大数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值