LF.56.Bipartite

 1 /*
 2 Determine if an undirected graph is bipartite. A bipartite graph is one in which the nodes can be divided into two groups such that no nodes have direct edges to other nodes in the same group.
 3
 4 Examples
 5
 6 1  --   2
 7
 8     /
 9
10 3  --   4
11
12 is bipartite (1, 3 in group 1 and 2, 4 in group 2).
13
14 1  --   2
15
16     /   |
17
18 3  --   4
19
20 is not bipartite.
21
22 Assumptions
23
24 The graph is represented by a list of nodes, and the list of nodes is not null.
25
26 */
27 /**
28  * public class GraphNode {
29  *   public int key;
30  *   public List<GraphNode> neighbors;
31  *   public GraphNode(int key) {
32  *     this.key = key;
33  *     this.neighbors = new ArrayList<GraphNode>();
34  *   }
35  * }
36  */
 1 //node 和 他的邻居 不能是一样的颜色
 2 public class Solution {
 3   public boolean isBipartite(List<GraphNode> graph) {
 4     // write your solution here
 5     if (graph == null) {
 6         return true ;
 7     }
 8     Map<GraphNode, Integer> visited = new HashMap<>() ;
 9     for ( GraphNode node : graph ) {
10         if (!helper(node, visited)) {
11             return false;
12         }
13     }
14     return true;
15   }
16   private boolean helper(GraphNode node, HashMap<GraphNode, Integer> visited){
17     //this node already be handled
18     if (visited.containsKey(node)) {
19         return true ;
20     }
21     Queue<GraphNode> queue = new LinkedList<>() ;
22     queue.offer(node);
23     //assign value
24     visited.put(node, 0);
25     while(!queue.isEmpty()){
26         GraphNode curr = queue.poll() ;
27         List<GraphNode> neighbors = curr.neighbors ;
28         int currColor = visited.get(curr) ;
29         int neiColor = currColor == 0 ? 1 :0 ;
30         for ( GraphNode nei : neighbors) {
31             /*if the nei has not yet been visited, then color it with neiColor,
32             mark it as visited and then offer it */
33             if (!visited.containsKey(nei)) {
34                 visited.put(nei, neiColor);
35                 queue.offer(nei);
36             } else{
37                 if (visited.get(nei) != neiColor) {
38                     return false ;
39                 }
40                 /*
41                 做图的时候千万要小心,如果 当前点的邻居已经访问过了, 则不要再放入queue 中
42                 否则一定死循环 所以图的 bfs 一定要 用一个字典来mark 访问过的点
43                 */
44             }
45         }
46     }
47     return true ;
48   }
49 }

做图的时候千万要小心,如果 当前点的邻居已经访问过了, 则不要再放入queue 中
否则一定死循环 所以图的 bfs 一定要 用一个字典来mark 访问过的点

原文地址:https://www.cnblogs.com/davidnyc/p/8684533.html

时间: 2024-11-04 09:15:07

LF.56.Bipartite的相关文章

使用JWPL (Java Wikipedia Library)操作维基百科数据

使用JWPL (Java Wikipedia Library)操作维基百科数据 1. JWPL介绍 JWPL(Java Wikipedia Library)是一个开源的访问wikipeida数据的Java API包,提供了快速访问维基百科中包含的消息,如重定向.类别.文章和链接结构的结构性访问接口.它提供的DataMachine 工具类可快速解析wiki格式文件,生成mysql的数据txt文件,可通过mysqlimport 导入到本地数据库中. JWPL介绍官网:https://dkpro.gi

读者的梦想,图书馆员的梦魇

作者:鱼鸟兽 链接:https://zhuanlan.zhihu.com/p/21602568 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一本无法被数字化的书 <S.>包含了两个世界:印刷的世界和书写的世界.在印刷的世界,也就是由旧书<忒修斯之船>及其所构成的故事里,充满了各种谜题:失忆的主角.被禁言的船员.神秘的女子,还有故事的创作者--作家石察卡和他的译注者柯岱拉.所有的元素之间有什么联系?<忒修斯之船>并没有给我们答案. 珍

HDU 1255 覆盖的面积 (扫描线 线段树 离散化)

题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了,因为虽然现在都不等于 2,但是之前的那个线段加上现在的已经覆盖2次了. 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 #include &

hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants to make the graph become a complete bipartite graph with most edges by adding some extra edges. Soda needs you to tell him the maximum number of edges

UESTC_The Most Wonderful Competition CDOJ 56

The Most Wonderful Competition Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status Last week, School of Applied Mathematics held a competition of flying kite, contestants are divided into pairs, and one c

java面试一定会遇到的56个面试题

1.问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示"main方法不是public的". 2.问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝. 3.问题:如果要重写一个对象的equals方法,还要考虑什么? 答案:hashCode. 4.问题:Java的"一次编写,处处运行"是如何实现的? 答案:Java程序会被编译成字节码组成的class文件,这些字节码可以

20多岁学习编程晚吗?看看56岁的大叔如何克服自我怀疑学习编程

原文地址:http://mp.weixin.qq.com/s/zzoPGDS5eELxEeO_zfG20w 版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 我 56 岁了,正在学编程. 为什么?因为我喜欢编程,现在也算得上是老司机了. 但是编程并不简单,学编程很难,不过我还可以接受. 我喜欢沉浸在算法带来的挑战中,也愿意挤出几分钟多进行一次测试,更爱"也许这一次就成功了"之后&qu

HttpWebRequest出错 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF

服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 主体意思是微软没有容忍不符合RFC 822中的httpHeader必须以CRLF结束的规定的服务器响应. 一个解决方案是在application.config或web.config文件里加入 <

hdu5354 Bipartite Graph

分治+并查集.假设要求[L,mid]的答案,那么很明显,如果一条边的两个端点都>mid的话或者一个端点>mid一个端点<L,说明询问[L,mid]这个区间中任何一点时候,这一条边都是连接的,否则的话递归下去处理.[mid+1,R]同理. 一个图不是二分图的话说明存在奇环,奇环可以用并查集处理.这里的并查集不使用路径压缩而使用按轶合并.并查集的还原操作可以用一个栈记录每次合并时的具体操作,然后按序还原即可. 代码 1 #include<cstdio> 2 #include<