FB面经Prepare: Bipartite a graph
input friends relations{{1,2}, {2,3}, {3,4}}
把人分成两拨,每拨人互相不认识,
所以应该是group1{1,3}, group2{2,4}
这道题应该是how to bipartite a graph
Taken from GeeksforGeeks
Following is a simple algorithm to find out whether a given graph is Birpartite or not using Breadth First Search (BFS) :-
- Assign RED color to the source vertex (putting into set U).
- Color all the neighbors with BLUE color (putting into set V).
- Color all neighbor’s neighbor with RED color (putting into set U).
- This way, assign color to all vertices such that it satisfies all the constraints of m way coloring problem where m = 2.
- While assigning colors, if we find a neighbor which is colored with same color as current vertex, then the graph cannot be colored with 2 vertices (or graph is not Bipartite).
Also, NOTE :-
-> It is possible to color a cycle graph with even cycle using two colors.
-> It is not possible to color a cycle graph with odd cycle using two colors.
EDIT :-
If a graph is not connected, it may have more than one bipartition. You need to check all those components separately with the algorithm as mentioned above.
So, for various disconnected sub-graph of the same graph, you need to perform this bipartition check on all of them separately using the same algorithm discussed above. All of those various disconnected sub-graph of the same graph will account for its own set of bipartition.
And, the graph will be termed bipartite, IF AND ONLY IF, each of its connected components are proved to be bipartite .
package fbOnsite;
import java.util.*;
public class Bipartite {
HashSet<Integer> list1 = new HashSet<Integer>();
HashSet<Integer> list2 = new HashSet<Integer>();
public void bfs(int[][] relations) {
HashMap<Integer, HashSet<Integer>> graph = new HashMap<Integer, HashSet<Integer>>();
for (int[] each : relations) {
if (!graph.containsKey(each[0]))
graph.put(each[0], new HashSet<Integer>());
if (!graph.containsKey(each[1]))
graph.put(each[1], new HashSet<Integer>());
graph.get(each[0]).add(each[1]);
graph.get(each[1]).add(each[0]);
}
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(relations[0][0]);
list1.add(relations[0][0]);
HashSet<Integer> visited = new HashSet<Integer>();
visited.add(relations[0][0]);
int count = 1;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i=0; i<size; i++) {
int person = queue.poll();
HashSet<Integer> friends = graph.get(person);
for (int each : friends) {
if (list1.contains(each)&&list1.contains(person) || list2.contains(each)&&list2.contains(person)) {
list1.clear();
list2.clear();
return;
}
if (!visited.contains(each)) {
if (count%2 == 1) list2.add(each);
else list1.add(each);
queue.offer(each);
visited.add(each);
}
}
}
count++;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Bipartite sol = new Bipartite();
int[][] relations1 = new int[][]{{1,2},{2,3},{3,4}};
int[][] relations2 = new int[][]{{1,2},{1,4},{1,6},{1,8},{2,3},{3,4},{3,6},{2,5},{4,5},{5,6},{5,8}};
int[][] relations3 = new int[][]{{1,2},{2,3},{3,1}};
sol.bfs(relations2);
System.out.println(sol.list1);
System.out.println(sol.list2);
}
}
FB面经Prepare: Bipartite a graph的更多相关文章
- FB面经 Prepare: All Palindromic Substrings
Given a string, calculate how many substring is palindrome. Ignore non-char characters. Ignore case; ...
- FB面经 Prepare: Task Schedule
tasks has cooldown time, give an input task id array, output finish time input: AABCA A--ABCA output ...
- FB面经 Prepare: Make Parentheses valid
给一组括号,remove最少的括号使得它valid 从左从右各scan一次 package fb; public class removeParen { public static String fi ...
- FB面经Prepare: Friends Recommendation
有个getFriend() API, 让你推荐你的朋友的朋友做你的朋友,当然这个新朋友不能是你原来的老朋友 package fb; import java.util.*; public class R ...
- FB面经Prepare: Dot Product
Conduct Dot Product of two large Vectors 1. two pointers 2. hashmap 3. 如果没有额外空间,如果一个很大,一个很小,适合scan小的 ...
- FB面经prepare: Count the number of Vector
给一个超级大的排好序的vector [abbcccdddeeee]比如,要求返回[{,a}, {,b}, {,c}, {,d}, {,e}......]复杂度要优于O(N) 分析: 如果是binary ...
- FB面经 Prepare: Even Tree
You are given a tree (a simple connected graph with no cycles). The tree has nodes numbered from to ...
- FB面经 Prepare: Largest Island
Find largest island in a board package fb; public class LargestIsland { public int findLargestIsland ...
- FB面经prepare: task schedule II
followup是tasks是无序的. 一开始是有序的,比如说1, 1, 2, 1,一定要先执行第一个task1,然后等task1恢复,再执行第2个task1,再执行task2..... follow ...
随机推荐
- 【转】GB2312、GBK和UTF-8三种编码的简要说明
原文地址:http://www.cnblogs.com/hust-yingjie/p/5481966.htmlGB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们 ...
- kubernetes核心概念
摘抄自: https://www.cnblogs.com/zhenyuyaodidiao/p/6500720.html 1.基础架构 1.1 Master Master节点上面主要由四个模块组成:A ...
- Linux基础性笔记
声明:这是我整理的韩顺平老师的课程,仅供自己参考!!! 给自己的一碗汤:学东西要专一(比较难) 第一节 Linux特点总结: 1. 免费的.开源的. 2. 支持多线程(并发).多用户. 3. 安全性比 ...
- HDFS及其各组件的机制
一.HDFS运行机制 概述:用户的文件会被切块后存储在多台datanode节点中,并且每个文件在整个集群中存放多个副本,副本的数量可以通过修改配置自己设定. HDFS:Hadoop Distribut ...
- Android 多媒体 播放音视频
1.播放音频 因为涉及到读取文件,所以需要申请权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_S ...
- 程序一 用记事本建立文件src.dat,其中存放若干字符。编写程序,从文件src.dat中读取数据,统计其中的大写字母、小写字母、数字、其它字符的个数,并将这些数据写入到文件test.dat中。
用记事本建立文件src.dat,其中存放若干字符.编写程序,从文件src.dat中读取数据,统计其中的大写字母.小写字母.数字.其它字符的个数,并将这些数据写入到文件test.dat中. #inclu ...
- 11_ for 练习 _ Math.sqrt
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- ng7 设置http proxy
看文档 proxy.conf.json { "/api": { "target": "http://localhost:5000", &qu ...
- Web Driver 8中定位方法 ——基于python语言
WebDriver提供了八种元素定位方法,在python 语言中,方法如下: id定位:find_element_by_id("id值"):id属性是唯一的. 1 driver ...
- java验证码生成
第一种方式:纯代码 先写jsp: 在编写CaptServlet: package cn.itcast.web.controller; import java.awt.Color; import jav ...