一天一道算法题---6.27---二分图

感谢微信平台---一天一道算法题---每天多一点进步---

Ah... last...

也很晚了 快2点半了

C罗也告别这届世界杯了  主要还是输给德国太多球了 美国也没赢 唉

还是来源于----> 待字闺中

原题

大家都知道facebook用户都是双向的好友,a是b的好友,那么b一定是a的好友,现在给定一个用户列表,其中有些用户是好友,有些不是,请判断,这些用户是否可以划分为两组,并且每组内的用户,互相都不是好友。如果能,请给出这个划分。

例子1: 用户:{1, 2, 3} 好友关系:1-2, 2-3 划分:{1,3} {2}

例子2: 用户{1,2,3,4} 好友关系:1-2, 2-3, 3-4,4-1 划分:{1, 3}{2, 4}

分析

有 很多面试题比较直接,看到题目,面试者很自然的就想到用什么方法,这时候,往往面试官要的是bug-free的code;还有一些问题,不那么直接,那就 是考察,应试者的分析问题、分解问题的能力。往往是一个相对复杂的问题,分解为我们见过的、相对简单的问题;还有一类问题,从实际当中来,这就需要有建模 的能力,也可以说是把问题抽象出来的能力,然后才是分解成小的问题等。这样的题目,能够全面的考察应试者的能力。例如今天的面试题。

今天的面试题来自facebook的实际问题。像在我们国内,有很多同学在做新浪微博的数据挖掘,好友推荐、关系预测、圈子发现、转发分析、影响力分析等等,这些都是很实际、很有用的问题,每一个问题,都可以作为一个值得深入探讨的面试题。

相 对而言,今天的面试题目比较简单。因为建模的部分,已经在题目中给出了。稍想一下,图分割的问题。facebook的好友关系是双向的,意味着是无向图 (新浪微博,twitter都是有向图)。然后,要把图划分为两组,这两组满足什么条件呢?组内没有边,组间有边。这显然就是一个二分图。

那问题很明显了,就是facebook好友关系构成的图,是否是一个二分图?如果是,请找到这个划分。就是二分图判断+找到一个划分即可。

根 据二分图的特性,一条边上的两个点,肯定是属于不同的组。如果它们出现在同一个组中,肯定就不是二分图了。怎么判断,一条边上的两个点,分属于不同的组 呢?我们需要遍历图,如果找到一条边,两个节点,都在同一组,则不是二分图;如果图遍历完成之后,没有找到这样的边,则是二分图。我们在遍历的过程中,我 们需要区分,一条边的两个节点分属于不同的组,这里我们用到了染色法。核心思想如下:

从某一个点开始,将这个节点染色为白色,并且开始广度 优先遍历,找到与其相邻的节点,如果是二分图,相邻节点的颜色都应该不同。如果是黑色,则不变;如果是无色,则染成黑色;如果是白色,也就是同色,程序退 出。当图遍历完毕时,没有相邻节点同色的,则是二分图,标记为白色和黑色的两组就是一个划分。

来看两个例子,第一个图中的例子2:

步骤 遍历节点 相邻节点 队列
1 1:白 2:黑,4:黑 2,4
2 2:黑 1:白,3:白 4,3
3 4:黑 1:白,3:白 3
4 3:白 2:黑,4:黑

队列空,结束遍历。找到划分{1,3}白{2,4}黑。

再看一个不是二分图的例子: 用户{1,2,3,4} 关系:1-2,1-3,1-4,2-3,3-4.

判断步骤如下:

步骤 遍历节点 相邻节点 队列
1 1:白 2:黑,3:黑,4:黑 2,3,4
2 2:黑 1:白,3:白 3,4

发现3矛盾了,则上面的关系,不够成二分图。

【分析完毕】

一天一道算法题---6.27---二分图,布布扣,bubuko.com

时间: 2024-10-20 06:36:23

一天一道算法题---6.27---二分图的相关文章

一天一道算法题---6.26---二分查找

感谢微信平台---一天一道算法题----每天多一点进步-- 好累啊  现在在用win7自带的输入法 打起来真麻烦 快点把这2天的搞完就重装了 还是直接来源于----〉 待字闺中 分析 给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.

一天一道算法题--6.25--无定义

感谢微信平台---一天一道算法题--每天多一点进步---- 其实今天我接下去补上的几题都来自---待字闺中 所以我就原封不动的将它的题目与分析搬过来了 原题 给定一个数组,我们可以找到两个不相交的.并且是连续的子数组A和B,A中的数字和为sum(A), B中的元素和为sum(B).找到这样的A和B,满足sum(A) - sum(B)的绝对值是最大的. 例如:[2, -1 -2, 1, -4, 2, 8]划分为A=[-1, -2, 1, -4], B=[2, 8], 最大的值为16 分析 如果没有

一天一道算法题--5.29---动态规划之数塔

感谢微信平台:  一天一道算法题-------每天多一点进步----------- 这题的话 我就直接用我们自己Oj的题目了 戳我 好吧  如今看这题  是很简单  当时 是块被它搞崩溃了   因为 还不知道  dp 这个概念 现在有了这个概念   好多了  但还是 只能做做这种水 dp.... 多么悲伤的故事 这题 因为太水了   晚上 应该会去找个高质量的题来做的 如果你是dp刚刚学 这题真的很适合你 1 #include <iostream> 2 #include <cstring

一天一道算法题---5.26---思维锻炼

感谢 微信平台: 一天一道算法题 -----  大家没事都可以去关注他 --- 不是做广告的---- 题目大意:  给你一个长度为n的整数序列A1,A2,--,An,找出两个整数Ai和Aj(i<j),使得Ai-Aj尽量大 反正 暴力肯定超时..... 数据大小 我也就给出了 反正 尽量用最好算法去解 就是了 嗯 它给的是o(n)的时间复杂度和空间度   但是很容易转换成o(1)空间度 o(n)时间复杂度的写法 这边给出个 与这题意相同的一个 题目  发现竟然是我以前WA的 怪不得 那么熟悉 ..

一天一道算法题--5.25--bfs或者最短路

好吧 还是拖到了5.26来写本是5.25的题... 自我 宽恕 老样子---  感谢    微信平台: 一天一道算法题   无聊的你 也可以去关注一下 题目 链接:http://poj.org/problem?id=3126 题目 大意:  给你2个素数 问从一个素数到另一个转换的过程中  每次只允许改变一个位上的数 并且在改动过程中 保证它也是素数  最少需要多少次实现这个转换? ok 其实 这题 不算难  当告诉你这是个搜索以后  只是在进行个位 十位 百位 千位 上各个数字尝试的时候 可能

一天一道算法题---6.3---二分运用

感谢微信平台 : 一天一道算法题 -----  一天多一点进步----- 先来段 废话: 已经 3 4天没更了 主要还是自己 太懒了 .... 好 让我们 开始吧 题目链接: touch  me 是不是 有点长啊  最可恶的是 还有张 诱人的 馅饼  --- 话说 有个很好的美国系列校园青春 sex movie ---  American Pie  --- 美国派----- 题目大意: 有F+1个人来分N个圆形蛋糕 每个人得到的必是一整块蛋糕 (不是由几块拼在一起的)面积要相同 求每个人最多能得

一天一道算法题---5.24.--递归

感谢 微信号---code4god  这是他们的微信平台  每日会提供一道算法题   我只是个搬运工 我们每一天都应该比昨天更强一点 观察下列式子:12 = 12*1 12 = 6*212 = 4*312 = 3*412 = 3*2*212 = 2*612 = 2*3*212 = 2*2*3对于给定的n 计算n公有多少种不同的分解式? 1 #include <iostream> 2 using namespace std; 3 4 int cnt;//记录拆分次数 5 void slove(

一天一道算法题--6.9--数学题

感谢微信平台----一天一道算法题---------每天多一点进步---- 今天 刚刚又玩了2盘 LOL  把我的时间全给弄光了..... 因为 晚上 可能开始写课程设计了 抓紧时间 写了今天的 关于那个 stack的 感觉超出我预期想象了 得压几天了 哎.. problem: 求和为指定数字的连续正整数序列 for example: Sn = 100时 18 19 20 21 22 9 10 11 12 13 14 15 16 analyse: 有事  先撤..... 刚刚头太痛 眼睛太酸了

前端面试的一道算法题

(使用canvas解答) 下面说一个跟前端有点相关并且有点趣的一道算法题. 题目: 平面上有若干个不特定的形状,如下图所示.请写程序求出物体的个数,以及每个不同物体的面积. 分析 想要知道有多少个图形,想到的就是先获取图片中的每一个像素点然后判获取像素点的背景颜色(RGBA).想要获得图片中的每一个像素点,那就可以联想到使用h5的canvas.如下: 菜鸟教程中canvas的getimagedata方法http://www.runoob.com/tags/canvas-getimagedata.