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.
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.
It is not possible to color a cycle graph with odd cycle using two colors.
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).