题目:

假如已知有n个人和m对好友关系(存于数字r)。如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。
假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1、2、3属于一个朋友圈,4、5属于另一个朋友圈,结果为2个朋友圈。

解析:

这道题本质上可以理解为求图的连通子图的个数,而求连通子图的个数问题则可以用不相交的集合来求解。至于不相交的集合的知识可以参见算法导论的第21章。

下面给出本人的源代码如下(代码尚未调试,故可能会有些bug):

#include <iostream>
using namespace std;template<class T> struct Node
{Node* parent;int rank;T value;Node(const T& v):parent(NULL), randk(0), value(v){}
}//struct/*
*返回指定节点所在的集合
*/
Node* find_root(Node* rhs)
{Node* root = NULL;if(rhs != NULL){Node* t = rhs;while(t->parent != NULL) t = t->parent;}//if(rhs != NULL)root = t;//将节点rhs到根节点路径上的节点的parent直接指向根节点Node* q = rhs, p = rhs->parent;while(p != NULL) {q->parent = root;q = p;p = p->parent;}//while(q->parent != NULL)return root;
}//find_root/*
*合并节点x和节点y所在的集合
*/
void union_set(Node* x, Node* y)
{if(x == NULL || y == NULL) return;Node* root_x = find_root(x);Node* root_y = find_root(y);if(root_x == root_y) return;//合并两个集合if(root_x->rank < root_y->rank){Node* t = root_x;root_x = root_y;root_y = t;}//if(root_x->rank < root_y->rank)root_y->parent = root_x;if(root_x->rank == root_y->rank) root_x->rank += 1;
}//union_setint main()
{int n; //人数int m;  //关系对数while(cin >> n >> m && n > 0 && m >= 0){vector<Node<int> > P;P.reserve(n);for(int i = 0; i < n; i++){P.push_back(Node<int>(i));}//for(int i = 0; i < n; i++)//根据朋友关系计算朋友圈的个数int circle_count = n;int person1, person2;for(int i = 0; i < m; i++){cin >> person1 >> person2;if(circle_count == 1) continue;  //若当前圈子已经为1,则没有必要继续后续的计算if(find_root(P[person1]) != find_root(P[person2]))  //读取当前关系对时,person1和person2不在同一个圈子里{if(circle_count > 1) circle_count--;   union_set(P[person1], P[person2]);}//if(find_root(P[person1]) != find_root(P[person2]))}//for(int i = 0; i < m; i++)//输出圈子数cout << "当前圈子数为: " << circle_count << endl;}//while(cin >> n >> m && n > 0 && m >= 0)
}//main

小米2013招聘笔试题:朋友圈相关推荐

  1. 2013年小米校园招聘笔试题-朋友圈

    3.朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. 假如 ...

  2. 2013年小米校园招聘笔试题

    ---------------------------------------------------------------------------------------------------- ...

  3. 2013年小米校园招聘笔试题---研发

    3.朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈.    ...

  4. 小米校园招聘笔试题--括号智能纠错

    一 问题描述: 二 解题思路: 因为要对括号序列进行插入操作,所以选择链表作为序列的数据结构,在判断括号序列是否合法时,要用到堆栈,所以选择堆栈用以存放左半括号 三 代码: /* This is a ...

  5. 2013年小米校园招聘笔试题(三)

    如上题目,自己设计的代码如下: /*You can mail me :wshust2007@163.com这个问题的基本思路如下:1.根据相互间的朋友关系, 二维的bitmap ,根据本题的已知条件, ...

  6. 2013 小米校园招聘笔试题之 找异形数

    异形数: 在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次.请写程序输出任意一个只出现一次的数字,程序时间和空间复杂度越小越好. 例如: a = {1,3,7,9,5,9 ...

  7. 2015去哪儿、大众点评、搜狗、小米校园招聘笔试题

    去哪儿 大众点评 1.有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复.要求你按照query的频度排序. hash映射: 1.顺序读取10个文件, ...

  8. 2015小米校园招聘笔试题

    1.判断一个数字是否为回文数字 想了半天也没想出什么特别好的办法,用最原始的办法做的 2.写一个多项式相乘的算法 输入格式比较奇葩,需要用库函数处理 C++的string的函数我都没记得,只好用Jav ...

  9. 2013搜狗校园招聘笔试题

    研习了Linux公社发布的2013搜狗校园招聘笔试题,还是有些收获的. //第一题:以下程序的输出是___________________ class Base { public:Base(int j ...

最新文章

  1. mysql安装文件瘦身_MySQL瘦身
  2. 【IT笔试面试题整理】删除无序链表中重复的节点
  3. 基于centos7系统mongodb3.,4.4安装
  4. content add tpl.php,phpcms后台批量上传添加图片文章方法详解(一)
  5. (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】
  6. 零值比较--BOOL,int,float,指针变量与零值比
  7. 全国计算机汉字录入是什么,什么是汉字录入?
  8. Vue引入Froala-Editor富文本编辑器
  9. arduino教程汇总
  10. 安卓的个性化彩色二维码的完美实现
  11. javascript中实现点赞
  12. 【蓝桥杯单片机组实战】2、高级计算器
  13. 直接更改maven的settings设置jdk版本
  14. 盲盒包装流水线(数据结构实践-栈)
  15. 51假期读书笔记(下)——流畅的python
  16. winform 窗体无法显示报错“未声明或从未赋值“解决办法
  17. 出现-nan(ind)的情况
  18. 全网最通俗的条件随机场CRF
  19. LeetCode 137.Single Number II 只出现一次的数字 II
  20. 天文方位角与大地方位角的区别

热门文章

  1. 用C++编写一个个性化的屏保程序,零基础小白可收藏学习!
  2. ubuntu 下如何修改 wifi 网卡的名称为 wlan0
  3. 虚拟机硬盘扩容(非LVM)
  4. JavaSE入门学习1:计算机基础知识
  5. 【AI】梯度下降的数学原理(05)
  6. 2.2 在Matlab中进行相机标定
  7. Kettle(数据过滤)
  8. 桌面图标有阴影的处理办法
  9. 机关事业单位计算机技师论文,2014年西安市机关事业单位工勤技能岗位技师等级考核论文格式及要求...
  10. Vue生命周期及各组件间的执行情况