求圈子用户数_2.0_2

//A以电影直接或间接关注的所有用户,A是follower,即A关注的
void followingUsers(unsigned int follower_id, unsigned int hobby_id)
{
    vector<FollowRelation>::iterator iterTemp = tempFrVec.begin();
    for(; iterTemp != tempFrVec.end(); iterTemp++)
    {
        if(iterTemp->followerId == follower_id && iterTemp->hobbyId == hobby_id && iterTemp->traverseFlag == INIT)
        {
            iterTemp->traverseFlag = IS_TRAVERSE;    
            //followingSet.insert(iterTemp->userId);
            circleSet.insert(iterTemp->userId);
            circleSet.insert(iterTemp->followerId);
            followingUsers(iterTemp->userId, hobby_id);//迭代,直到所有直接的和间接的全部遍历完
        }
    }    
}

//以电影直接或间接关注A的所有用户,A是user,即关注A的
void followedUsers(unsigned int user_id, unsigned int hobby_id)
{
    vector<FollowRelation>::iterator iterTemp = tempFrVec.begin();
    for(; iterTemp != tempFrVec.end(); iterTemp++)
    {
        if(iterTemp->userId == user_id && iterTemp->hobbyId == hobby_id && iterTemp->traverseFlag == INIT)
        {
            iterTemp->traverseFlag = IS_TRAVERSE;    
            //followedSet.insert(iterTemp->followerId);    
            circleSet.insert(iterTemp->followerId);
            circleSet.insert(iterTemp->userId);
            followedUsers(iterTemp->followerId, hobby_id);
        }
    }
}

/******************************************************************************
功能:      计算指定(用户,爱好)的圈子的用户数量
输入参数:
    user_id :  指定用户
    hobby_id:  指定爱好
返回值:
    成功,返回该圈子的用户数量。
    失败,返回0。
*******************************************************************************/
unsigned int CalcUserNum(unsigned int user_id, unsigned int hobby_id)
{
    //判断指定的用户是否有指定的爱好
    if(isExistCheck(user_id,hobby_id) == -1)
    {
        return 0;
    }

    //每次计算之前清空set
    if(!circleSet.empty())
    {
        circleSet.clear();
    }
        
    circleSet.insert(user_id);//圈子数包括自身

    //处理关注圈和被关注圈的用户数量
    if(!tempFrVec.empty())
    {
        tempFrVec.clear();
    }
    tempFrVec = followRelationVec;
    followingUsers(user_id, hobby_id);

    if(!tempFrVec.empty())
    {
        tempFrVec.clear();
    }
    tempFrVec = followRelationVec;
    followedUsers(user_id, hobby_id);
    
    return circleSet.size();
}

/******************************************************************************
功能:清空所有数据
输入:无
输出:无  
返回:无
*******************************************************************************/
void Clear(void)
{
    if(!followRelationVec.empty())
    {
        followRelationVec.clear();
    }    

    if(!userHobbysMap.empty())
    {
        userHobbysMap.clear();
    }
    
    if(!circleSet.empty())
    {
        circleSet.clear();
    }

    if(!tempFrVec.empty())
    {
        tempFrVec.clear();
    }

    return;
}

后记,标题说是2.0,其实都写了好多次了,估计都有2.7、2.8了,oj系统上也提交了有10次。
好在最后10个用例终于全部pass。此题关键是迭代抽象的要好,标记变量设计的漂亮,然后关注链和被关注链要分别迭代。

原文地址:https://www.cnblogs.com/liuzc/p/6552587.html