博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FB面经Prepare: Bipartite a graph
阅读量:4665 次
发布时间:2019-06-09

本文共 3257 字,大约阅读时间需要 10 分钟。

input friends relations{
{1,2}, {2,3}, {3,4}}把人分成两拨,每拨人互相不认识,所以应该是group1{
1,3}, group2{2,4}

这道题应该是how to bipartite a graph

Taken from 

Following is a simple algorithm to find out whether a given graph is Birpartite or not using Breadth First Search (BFS) :-

  1. Assign RED color to the source vertex (putting into set U).
  2. Color all the neighbors with BLUE color (putting into set V).
  3. Color all neighbor’s neighbor with RED color (putting into set U).
  4. This way, assign color to all vertices such that it satisfies all the constraints of m way coloring problem where m = 2.
  5. 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 .

1 package fbOnsite; 2  3 import java.util.*; 4  5 public class Bipartite { 6     HashSet
list1 = new HashSet
(); 7 HashSet
list2 = new HashSet
(); 8 9 public void bfs(int[][] relations) {10 HashMap
> graph = new HashMap
>();11 for (int[] each : relations) {12 if (!graph.containsKey(each[0]))13 graph.put(each[0], new HashSet
());14 if (!graph.containsKey(each[1]))15 graph.put(each[1], new HashSet
());16 graph.get(each[0]).add(each[1]);17 graph.get(each[1]).add(each[0]);18 }19 20 21 Queue
queue = new LinkedList
();22 queue.offer(relations[0][0]);23 list1.add(relations[0][0]);24 HashSet
visited = new HashSet
();25 visited.add(relations[0][0]);26 int count = 1;27 while (!queue.isEmpty()) {28 int size = queue.size();29 for (int i=0; i
friends = graph.get(person);32 for (int each : friends) {33 if (list1.contains(each)&&list1.contains(person) || list2.contains(each)&&list2.contains(person)) {34 list1.clear();35 list2.clear();36 return;37 }38 39 if (!visited.contains(each)) {40 if (count%2 == 1) list2.add(each);41 else list1.add(each);42 queue.offer(each);43 visited.add(each);44 }45 }46 }47 count++;48 }49 }50 51 52 53 /**54 * @param args55 */56 public static void main(String[] args) {57 // TODO Auto-generated method stub58 Bipartite sol = new Bipartite();59 int[][] relations1 = new int[][]{ {1,2},{2,3},{3,4}};60 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}};61 int[][] relations3 = new int[][]{ {1,2},{2,3},{3,1}};62 sol.bfs(relations2);63 System.out.println(sol.list1);64 System.out.println(sol.list2);65 }66 67 }

 

转载于:https://www.cnblogs.com/EdwardLiu/p/6552027.html

你可能感兴趣的文章
NSString 比较(转)
查看>>
[hdu3631]背包或中途相遇法
查看>>
模块化开发(seajs)
查看>>
HDU1848 Fibonacci again and again 博弈 SG函数
查看>>
iOS-自建iPa应用分发平台
查看>>
12月2日站立会议
查看>>
【转载】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
查看>>
DBA笔记oracle undo_retention参数可动态修改
查看>>
123我爱你
查看>>
HDU 4033 Regular Polygon(几何 + 二分)
查看>>
webgl example1
查看>>
通过游戏学python 3.6 第一季 第四章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数...
查看>>
Django基础内容整理
查看>>
DTcms网站伪静态逻辑
查看>>
网络类型判断
查看>>
黑客dos命令大全
查看>>
Java开发必用的工具包
查看>>
https soap链接示例
查看>>
八LWIP学习笔记之用户编程接口(NETCONN)
查看>>
Git Day02,工作区,暂存区,回退,删除文件
查看>>