小米2013招聘笔试题:朋友圈
题目:
假如已知有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招聘笔试题:朋友圈相关推荐
- 2013年小米校园招聘笔试题-朋友圈
3.朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. 假如 ...
- 2013年小米校园招聘笔试题
---------------------------------------------------------------------------------------------------- ...
- 2013年小米校园招聘笔试题---研发
3.朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. ...
- 小米校园招聘笔试题--括号智能纠错
一 问题描述: 二 解题思路: 因为要对括号序列进行插入操作,所以选择链表作为序列的数据结构,在判断括号序列是否合法时,要用到堆栈,所以选择堆栈用以存放左半括号 三 代码: /* This is a ...
- 2013年小米校园招聘笔试题(三)
如上题目,自己设计的代码如下: /*You can mail me :wshust2007@163.com这个问题的基本思路如下:1.根据相互间的朋友关系, 二维的bitmap ,根据本题的已知条件, ...
- 2013 小米校园招聘笔试题之 找异形数
异形数: 在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次.请写程序输出任意一个只出现一次的数字,程序时间和空间复杂度越小越好. 例如: a = {1,3,7,9,5,9 ...
- 2015去哪儿、大众点评、搜狗、小米校园招聘笔试题
去哪儿 大众点评 1.有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复.要求你按照query的频度排序. hash映射: 1.顺序读取10个文件, ...
- 2015小米校园招聘笔试题
1.判断一个数字是否为回文数字 想了半天也没想出什么特别好的办法,用最原始的办法做的 2.写一个多项式相乘的算法 输入格式比较奇葩,需要用库函数处理 C++的string的函数我都没记得,只好用Jav ...
- 2013搜狗校园招聘笔试题
研习了Linux公社发布的2013搜狗校园招聘笔试题,还是有些收获的. //第一题:以下程序的输出是___________________ class Base { public:Base(int j ...
最新文章
- mysql安装文件瘦身_MySQL瘦身
- 【IT笔试面试题整理】删除无序链表中重复的节点
- 基于centos7系统mongodb3.,4.4安装
- content add tpl.php,phpcms后台批量上传添加图片文章方法详解(一)
- (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】
- 零值比较--BOOL,int,float,指针变量与零值比
- 全国计算机汉字录入是什么,什么是汉字录入?
- Vue引入Froala-Editor富文本编辑器
- arduino教程汇总
- 安卓的个性化彩色二维码的完美实现
- javascript中实现点赞
- 【蓝桥杯单片机组实战】2、高级计算器
- 直接更改maven的settings设置jdk版本
- 盲盒包装流水线(数据结构实践-栈)
- 51假期读书笔记(下)——流畅的python
- winform 窗体无法显示报错“未声明或从未赋值“解决办法
- 出现-nan(ind)的情况
- 全网最通俗的条件随机场CRF
- LeetCode 137.Single Number II 只出现一次的数字 II
- 天文方位角与大地方位角的区别