一些经常犯的错误

1.建树时寻找树的根


vector<int>tree[N];
int root = -1;

/*错误代码,思路是如果当前root存的节点不是根,
那么一定会有对应的father节点,因此总会更新为它的father节点
直到root是真正根节点,才不会被更新。
*/
void build(){
    int n;cin>>n;
    for(int i = 0;i<n;i++){
        int child,father;cin>>child>>father;
        if(child==root||root==-1){
            root = father;
        }
        tree[father].push_back(child);
    }
}

/*最终结果不一定是root,因为给出的father->child顺序是乱的,
可能导致当前root并非根,然而由于当前节点的father在之前已经给出,
因此root不会再被更新。
*/

//正解
bool childs[n];
void build(){
    int n;cin>>n;
    for(int i = 0;i<n;i++){
        int child,father;cin>>child>>father;
        childs[child] = true;
        tree[father].push_back(child);
    }
    for(int i = 0;i<n;i++){
        if(!child[i]){
            root = i;
            break;
        }
    }
}
        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值