//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。此题关键是迭代抽象的要好,标记变量设计的漂亮,然后关注链和被关注链要分别迭代。