*Check whether a given graph is Bipartite or not
2016-01-26 03:13
567 查看
A Bipartite Graph is a graph whose vertices can be divided into two independent sets, U and V such that every edge (u, v) either connects a vertex from U to V or a vertex from V to U. In other words, for every edge (u, v), either u belongs to U and v to V, or u belongs to V and v to U. We can also say that there is no edge that connects vertices of same set.
![](http://d1gjlxt8vb0knt.cloudfront.net//wp-content/uploads/Bipartite1.png)
A bipartite graph is possible if the graph coloring is possible using two colors such that vertices in a set are colored with the same color. Note that it is possible to color a cycle graph with even cycle using two colors. For example, see the following graph.
![](http://d1gjlxt8vb0knt.cloudfront.net//wp-content/uploads/Bipartite2.png)
It is not possible to color a cycle graph with odd cycle using two colors.
![](http://d1gjlxt8vb0knt.cloudfront.net//wp-content/uploads/Bipartite3.png)
Algorithm to check if a graph is Bipartite:
Output:
Refer this for C implementation of the same.
Time Complexity of the above approach is same as that Breadth First Search. In above implementation is O(V^2) where V is number of vertices. If graph is represented using adjacency list, then the complexity becomes O(V+E).
![](http://d1gjlxt8vb0knt.cloudfront.net//wp-content/uploads/Bipartite1.png)
A bipartite graph is possible if the graph coloring is possible using two colors such that vertices in a set are colored with the same color. Note that it is possible to color a cycle graph with even cycle using two colors. For example, see the following graph.
![](http://d1gjlxt8vb0knt.cloudfront.net//wp-content/uploads/Bipartite2.png)
It is not possible to color a cycle graph with odd cycle using two colors.
![](http://d1gjlxt8vb0knt.cloudfront.net//wp-content/uploads/Bipartite3.png)
Algorithm to check if a graph is Bipartite:
// Java program to find out whether a given graph is Bipartite or not import java.util.*; import java.lang.*; import java.io.*; class Bipartite { final static int V = 4; // No. of Vertices // This function returns true if graph G[V][V] is Bipartite, else false boolean isBipartite(int G[][],int src) { // Create a color array to store colors assigned to all veritces. // Vertex number is used as index in this array. The value '-1' // of colorArr[i] is used to indicate that no color is assigned // to vertex 'i'. The value 1 is used to indicate first color // is assigned and value 0 indicates second color is assigned. int colorArr[] = new int[V]; for (int i=0; i<V; ++i) colorArr[i] = -1; // Assign first color to source colorArr[src] = 1; // Create a queue (FIFO) of vertex numbers and enqueue // source vertex for BFS traversal LinkedList<Integer>q = new LinkedList<Integer>(); q.add(src); // Run while there are vertices in queue (Similar to BFS) while (q.size() != 0) { // Dequeue a vertex from queue int u = q.poll(); // Find all non-colored adjacent vertices for (int v=0; v<V; ++v) { // An edge from u to v exists and destination v is // not colored if (G[u][v]==1 && colorArr[v]==-1) { // Assign alternate color to this adjacent v of u colorArr[v] = 1-colorArr[u]; q.add(v); } // An edge from u to v exists and destination v is // colored with same color as u else if (G[u][v]==1 && colorArr[v]==colorArr[u]) return false; } } // If we reach here, then all adjacent vertices can // be colored with alternate color return true; } // Driver program to test above function public static void main (String[] args) { int G[][] = {{0, 1, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1}, {1, 0, 1, 0} }; Bipartite b = new Bipartite(); if (b.isBipartite(G, 0)) System.out.println("Yes"); else System.out.println("No"); } } // Contributed by Aakash Hasija
Output:
Yes
Refer this for C implementation of the same.
Time Complexity of the above approach is same as that Breadth First Search. In above implementation is O(V^2) where V is number of vertices. If graph is represented using adjacency list, then the complexity becomes O(V+E).
相关文章推荐
- 小娜学法(17):如何获取案件信息?
- MongoDB Aggregate Methods(2) MonoDB 的 3 种聚合函数
- 输出螺旋矩阵
- 03-构造可靠数据传输协议
- 02-topdown
- U3d键值整理
- MONGODB 与sql聚合操作对应图
- grub 启动错误 "file not found"
- Python如何读取指定文件夹下的所有图像
- Python 列表(list)操作
- for语句引起一个死循环而引发的思考!!!
- 夺命雷公狗暂定的课程表
- 创业的一百一十四天
- UVA - 11136 Hoax or what
- Java I/O流详解
- ubuntu常用命令
- LeetCode 238:Product of Array Except Self
- Flyme patchrom项目笔记
- hdu 5506 GT and set(dfs爆搜)
- 笔记——javascript图片库改进版