📜  检查给定图是否为二分图

📅  最后修改于: 2022-05-13 01:57:53.951000             🧑  作者: Mango

检查给定图是否为二分图

二分图是一个图,它的顶点可以分为两个独立的集合,U 和 V,使得每条边 (u, v) 要么连接从 U 到 V 的顶点,要么连接从 V 到 U 的顶点。换句话说,对于每个边(u, v),要么u属于U,v属于V,要么u属于V,v属于U。我们也可以说没有边连接同一个集合的顶点。

二分1

如果可以使用两种颜色对图着色,使得集合中的顶点用相同的颜色着色,则二分图是可能的。请注意,可以使用两种颜色为具有偶数循环的循环图着色。例如,请参见下图。

二分法2

不可能使用两种颜色为具有奇数周期的周期图着色。

双边3

检查图是否为二分图的算法:
一种方法是使用回溯算法 m 着色问题来检查图形是否可 2 着色。
以下是使用广度优先搜索 (BFS) 确定给定图是否为二分图的简单算法。
1. 为源顶点指定红色(放入集合 U)。
2. 用蓝色为所有邻居着色(放入集合 V)。
3. 用红色为所有邻居的邻居着色(放入集合 U)。
4. 这样,为所有顶点分配颜色,使其满足 m = 2 的 m 路着色问题的所有约束。
5.在分配颜色时,如果我们找到一个与当前顶点颜色相同的邻居,那么图不能用2个顶点着色(或者图不是二分图)

C++
// C++ program to find out whether a
// given graph is Bipartite or not
#include 
#include 
#define V 4
 
using namespace std;
 
// This function returns true if graph
// G[V][V] is Bipartite, else false
bool isBipartite(int G[][V], int src)
{
    // Create a color array to store colors
    // assigned to all vertices. 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[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
    queue  q;
    q.push(src);
 
    // Run while there are vertices
    // in queue (Similar to BFS)
    while (!q.empty())
    {
        // Dequeue a vertex from queue ( Refer http://goo.gl/35oz8 )
        int u = q.front();
        q.pop();
 
        // Return false if there is a self-loop
        if (G[u][u] == 1)
        return false;
 
        // 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] && colorArr[v] == -1)
            {
                // Assign alternate color to this adjacent v of u
                colorArr[v] = 1 - colorArr[u];
                q.push(v);
            }
 
            // An edge from u to v exists and destination
            // v is colored with same color as u
            else if (G[u][v] && 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
int main()
{
    int G[][V] = {{0, 1, 0, 1},
        {1, 0, 1, 0},
        {0, 1, 0, 1},
        {1, 0, 1, 0}
    };
 
    isBipartite(G, 0) ? cout << "Yes" : cout << "No";
    return 0;
}


Java
// 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 vertices.
        // 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; iq = new LinkedList();
        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();
 
            // Return false if there is a self-loop
            if (G[u][u] == 1)
                return false;
 
            // Find all non-colored adjacent vertices
            for (int v=0; v


Python3
# Python program to find out whether a
# given graph is Bipartite or not
 
class Graph():
 
    def __init__(self, V):
        self.V = V
        self.graph = [[0 for column in range(V)] \
                                for row in range(V)]
 
    # This function returns true if graph G[V][V]
    # is Bipartite, else false
    def isBipartite(self, src):
 
        # Create a color array to store colors
        # assigned to all vertices. 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.
        colorArr = [-1] * self.V
 
        # Assign first color to source
        colorArr[src] = 1
 
        # Create a queue (FIFO) of vertex numbers and
        # enqueue source vertex for BFS traversal
        queue = []
        queue.append(src)
 
        # Run while there are vertices in queue
        # (Similar to BFS)
        while queue:
 
            u = queue.pop()
 
            # Return false if there is a self-loop
            if self.graph[u][u] == 1:
                return False;
 
            for v in range(self.V):
 
                # An edge from u to v exists and destination
                # v is not colored
                if self.graph[u][v] == 1 and colorArr[v] == -1:
 
                    # Assign alternate color to this
                    # adjacent v of u
                    colorArr[v] = 1 - colorArr[u]
                    queue.append(v)
 
                # An edge from u to v exists and destination
                # v is colored with same color as u
                elif self.graph[u][v] == 1 and 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
g = Graph(4)
g.graph = [[0, 1, 0, 1],
            [1, 0, 1, 0],
            [0, 1, 0, 1],
            [1, 0, 1, 0]
            ]
             
print ("Yes" if g.isBipartite(0) else "No")
 
# This code is contributed by Divyanshu Mehta


C#
// C# program to find out whether
// a given graph is Bipartite or not
using System;
using System.Collections.Generic;
 
class GFG
{
    readonly static int V = 4; // No. of Vertices
 
    // This function returns true if
    // graph G[V,V] is Bipartite, else false
    bool isBipartite(int [,]G, int src)
    {
        // Create a color array to store
        // colors assigned to all vertices.
        // 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
        Listq = new List();
        q.Add(src);
 
        // Run while there are vertices
        // in queue (Similar to BFS)
        while (q.Count != 0)
        {
            // Dequeue a vertex from queue
            int u = q[0];
            q.RemoveAt(0);
 
            // Return false if there is a self-loop
            if (G[u, u] == 1)
                return false;
 
            // 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 Code
    public static void Main(String[] args)
    {
        int [,]G = {{0, 1, 0, 1},
                    {1, 0, 1, 0},
                    {0, 1, 0, 1},
                    {1, 0, 1, 0}};
        GFG b = new GFG();
        if (b.isBipartite(G, 0))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by Rajput-Ji


Javascript


C++
// C++ program to find out whether
// a given graph is Bipartite or not.
// It works for disconnected graph also.
#include 
 
using namespace std;
 
const int V = 4;
 
// This function returns true if
// graph G[V][V] is Bipartite, else false
bool isBipartiteUtil(int G[][V], int src, int colorArr[])
{
    colorArr[src] = 1;
 
    // Create a queue (FIFO) of vertex numbers a
    // nd enqueue source vertex for BFS traversal
    queue q;
    q.push(src);
 
    // Run while there are vertices in queue (Similar to
    // BFS)
    while (!q.empty()) {
        // Dequeue a vertex from queue ( Refer
        // http://goo.gl/35oz8 )
        int u = q.front();
        q.pop();
 
        // Return false if there is a self-loop
        if (G[u][u] == 1)
            return false;
 
        // 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] && colorArr[v] == -1) {
                // Assign alternate color to this
                // adjacent v of u
                colorArr[v] = 1 - colorArr[u];
                q.push(v);
            }
 
            // An edge from u to v exists and destination
            // v is colored with same color as u
            else if (G[u][v] && colorArr[v] == colorArr[u])
                return false;
        }
    }
 
    // If we reach here, then all adjacent vertices can
    // be colored with alternate color
    return true;
}
 
// Returns true if G[][] is Bipartite, else false
bool isBipartite(int G[][V])
{
    // Create a color array to store colors assigned to all
    // vertices. 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[V];
    for (int i = 0; i < V; ++i)
        colorArr[i] = -1;
 
    // This code is to handle disconnected graph
    for (int i = 0; i < V; i++)
        if (colorArr[i] == -1)
            if (isBipartiteUtil(G, i, colorArr) == false)
                return false;
 
    return true;
}
 
// Driver code
int main()
{
    int G[][V] = { { 0, 1, 0, 1 },
                   { 1, 0, 1, 0 },
                   { 0, 1, 0, 1 },
                   { 1, 0, 1, 0 } };
 
    isBipartite(G) ? cout << "Yes" : cout << "No";
    return 0;
}


Java
// JAVA Code to check whether a given
// graph is Bipartite or not
import java.util.*;
 
class Bipartite {
 
    public static int V = 4;
 
    // This function returns true if graph
    // G[V][V] is Bipartite, else false
    public static boolean
    isBipartiteUtil(int G[][], int src, int colorArr[])
    {
        colorArr[src] = 1;
 
        // Create a queue (FIFO) of vertex numbers and
        // enqueue source vertex for BFS traversal
        LinkedList q = new LinkedList();
        q.add(src);
 
        // Run while there are vertices in queue
        // (Similar to BFS)
        while (!q.isEmpty()) {
            // Dequeue a vertex from queue
            // ( Refer http://goo.gl/35oz8 )
            int u = q.getFirst();
            q.pop();
 
            // Return false if there is a self-loop
            if (G[u][u] == 1)
                return false;
 
            // 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.push(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;
    }
 
    // Returns true if G[][] is Bipartite, else false
    public static boolean isBipartite(int G[][])
    {
        // Create a color array to store colors assigned
        // to all vertices. 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;
 
        // This code is to handle disconnected graph
        for (int i = 0; i < V; i++)
            if (colorArr[i] == -1)
                if (isBipartiteUtil(G, i, colorArr)
                    == false)
                    return false;
 
        return true;
    }
 
    /* Driver code*/
    public static void main(String[] args)
    {
        int G[][] = { { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 },
                      { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 } };
 
        if (isBipartite(G))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Arnav Kr. Mandal.


Python3
# Python3 program to find out whether a
# given graph is Bipartite or not
 
 
class Graph():
 
    def __init__(self, V):
        self.V = V
        self.graph = [[0 for column in range(V)]
                      for row in range(V)]
 
        self.colorArr = [-1 for i in range(self.V)]
 
    # This function returns true if graph G[V][V]
    # is Bipartite, else false
    def isBipartiteUtil(self, src):
 
        # Create a color array to store colors
        # assigned to all vertices. Vertex
        # number is used as index in this array.
        # The value '-1' of self.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.
 
        # Assign first color to source
 
        # Create a queue (FIFO) of vertex numbers and
        # enqueue source vertex for BFS traversal
        queue = []
        queue.append(src)
 
        # Run while there are vertices in queue
        # (Similar to BFS)
        while queue:
 
            u = queue.pop()
 
            # Return false if there is a self-loop
            if self.graph[u][u] == 1:
                return False
 
            for v in range(self.V):
 
                # An edge from u to v exists and
                # destination v is not colored
                if (self.graph[u][v] == 1 and
                        self.colorArr[v] == -1):
 
                    # Assign alternate color to
                    # this adjacent v of u
                    self.colorArr[v] = 1 - self.colorArr[u]
                    queue.append(v)
 
                # An edge from u to v exists and destination
                # v is colored with same color as u
                elif (self.graph[u][v] == 1 and
                      self.colorArr[v] == self.colorArr[u]):
                    return False
 
        # If we reach here, then all adjacent
        # vertices can be colored with alternate
        # color
        return True
 
    def isBipartite(self):
        self.colorArr = [-1 for i in range(self.V)]
        for i in range(self.V):
            if self.colorArr[i] == -1:
                if not self.isBipartiteUtil(i):
                    return False
        return True
 
 
# Driver Code
g = Graph(4)
g.graph = [[0, 1, 0, 1],
           [1, 0, 1, 0],
           [0, 1, 0, 1],
           [1, 0, 1, 0]]
 
print ("Yes" if g.isBipartite() else "No")
 
# This code is contributed by Anshuman Sharma


C#
// C# Code to check whether a given
// graph is Bipartite or not
using System;
using System.Collections.Generic;
 
class GFG {
    public static int V = 4;
 
    // This function returns true if graph
    // G[V,V] is Bipartite, else false
    public static bool isBipartiteUtil(int[, ] G, int src,
                                       int[] colorArr)
    {
        colorArr[src] = 1;
 
        // Create a queue (FIFO) of vertex numbers and
        // enqueue source vertex for BFS traversal
        Queue q = new Queue();
        q.Enqueue(src);
 
        // Run while there are vertices in queue
        // (Similar to BFS)
        while (q.Count != 0) {
            // Dequeue a vertex from queue
            // ( Refer http://goo.gl/35oz8 )
            int u = q.Peek();
            q.Dequeue();
 
            // Return false if there is a self-loop
            if (G[u, u] == 1)
                return false;
 
            // 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.Enqueue(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;
    }
 
    // Returns true if G[,] is Bipartite,
    // else false
    public static bool isBipartite(int[, ] G)
    {
        // Create a color array to store
        // colors assigned to all vertices.
        // 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;
 
        // This code is to handle disconnected graph
        for (int i = 0; i < V; i++)
            if (colorArr[i] == -1)
                if (isBipartiteUtil(G, i, colorArr)
                    == false)
                    return false;
 
        return true;
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[, ] G = { { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 },
                      { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 } };
 
        if (isBipartite(G))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by Rajput-Ji


Javascript


C++
#include 
using namespace std;
 
bool isBipartite(int V, vector adj[])
{
    // vector to store colour of vertex
    // assigning all to -1 i.e. uncoloured
    // colours are either 0 or 1
      // for understanding take 0 as red and 1 as blue
    vector col(V, -1);
 
    // queue for BFS storing {vertex , colour}
    queue > q;
   
      //loop incase graph is not connected
    for (int i = 0; i < V; i++) {
       
      //if not coloured
        if (col[i] == -1) {
           
          //colouring with 0 i.e. red
            q.push({ i, 0 });
            col[i] = 0;
           
            while (!q.empty()) {
                pair p = q.front();
                q.pop();
               
                  //current vertex
                int v = p.first;
                  //colour of current vertex
                int c = p.second;
                 
                  //traversing vertexes connected to current vertex
                for (int j : adj[v]) {
                   
                      //if already coloured with parent vertex color
                      //then bipartite graph is not possible
                    if (col[j] == c)
                        return 0;
                   
                      //if uncoloured
                    if (col[j] == -1) {
                      //colouring with opposite color to that of parent
                        col[j] = (c) ? 0 : 1;
                        q.push({ j, col[j] });
                    }
                }
            }
        }
    }
    //if all vertexes are coloured such that
      //no two connected vertex have same colours
    return 1;
}
 
 
// { Driver Code Starts.
int main()
{
 
    int V, E;
    V = 4 , E = 8;
      //adjacency list for storing graph
    vector adj[V];
      adj[0] = {1,3};
      adj[1] = {0,2};
      adj[2] = {1,3};
      adj[3] = {0,2};
     
   
    bool ans = isBipartite(V, adj);
    //returns 1 if bipartite graph is possible
      if (ans)
        cout << "Yes\n";
    //returns 0 if bipartite graph is not possible
      else
        cout << "No\n";
 
    return 0;
}
 // code Contributed By Devendra Kolhe


Java
import java.util.*;
 
public class GFG{
     
    static class Pair{
        int first, second;
         
        Pair(int f, int s){
            first = f;
            second = s;
        }
    }
     
    static boolean isBipartite(int V, ArrayList> adj)
    {
       
        // vector to store colour of vertex
        // assigning all to -1 i.e. uncoloured
        // colours are either 0 or 1
        // for understanding take 0 as red and 1 as blue
        int col[] = new int[V];
        Arrays.fill(col, -1);
     
        // queue for BFS storing {vertex , colour}
        Queue q = new LinkedList();
     
        //loop incase graph is not connected
        for (int i = 0; i < V; i++) {
         
        // if not coloured
            if (col[i] == -1) {
             
            // colouring with 0 i.e. red
                q.add(new Pair(i, 0));
                col[i] = 0;
             
                while (!q.isEmpty()) {
                    Pair p = q.peek();
                    q.poll();
                 
                    //current vertex
                    int v = p.first;
                   
                    // colour of current vertex
                    int c = p.second;
                     
                    // traversing vertexes connected to current vertex
                    for (int j : adj.get(v))
                    {
                     
                        // if already coloured with parent vertex color
                        // then bipartite graph is not possible
                        if (col[j] == c)
                            return false;
                     
                        // if uncoloured
                        if (col[j] == -1)
                        {
                           
                        // colouring with opposite color to that of parent
                            col[j] = (c==1) ? 0 : 1;
                            q.add(new Pair(j, col[j]));
                        }
                    }
                }
            }
        }
       
        // if all vertexes are coloured such that
        // no two connected vertex have same colours
        return true;
    }
     
    // Driver Code Starts.
    public static void main(String args[])
    {
     
        int V, E;
        V = 4 ;
        E = 8;
         
        // adjacency list for storing graph
        ArrayList> adj = new ArrayList>();
         
        for(int i = 0; i < V; i++){
            adj.add(new ArrayList());
        }
         
        adj.get(0).add(1);
        adj.get(0).add(3);
         
        adj.get(1).add(0);
        adj.get(1).add(2);
         
        adj.get(2).add(1);
        adj.get(2).add(3);
         
        adj.get(3).add(0);
        adj.get(3).add(2);
         
        boolean ans = isBipartite(V, adj);
         
        // returns 1 if bipartite graph is possible
        if (ans)
            System.out.println("Yes");
       
        // returns 0 if bipartite graph is not possible
        else
            System.out.println("No");
     
    }
}
 
// This code is contributed by adityapande88.


Python3
def isBipartite(V, adj):
    # vector to store colour of vertex
    # assigning all to -1 i.e. uncoloured
    # colours are either 0 or 1
    # for understanding take 0 as red and 1 as blue
    col = [-1]*(V)
   
    # queue for BFS storing {vertex , colour}
    q = []
   
    #loop incase graph is not connected
    for i in range(V):
       
        # if not coloured
        if (col[i] == -1):
           
            # colouring with 0 i.e. red
            q.append([i, 0])
            col[i] = 0
           
            while len(q) != 0:
                p = q[0]
                q.pop(0)
               
                # current vertex
                v = p[0]
                 
                # colour of current vertex
                c = p[1]
                   
                # traversing vertexes connected to current vertex
                for j in adj[v]:
                   
                    # if already coloured with parent vertex color
                    # then bipartite graph is not possible
                    if (col[j] == c):
                        return False
                   
                    # if uncoloured
                    if (col[j] == -1):
                       
                        # colouring with opposite color to that of parent
                        if c == 1:
                            col[j] = 0
                        else:
                            col[j] = 1
                        q.append([j, col[j]])
     
    # if all vertexes are coloured such that
    # no two connected vertex have same colours
    return True
 
V, E = 4, 8
 
# adjacency list for storing graph
adj = []
adj.append([1,3])
adj.append([0,2])
adj.append([1,3])
adj.append([0,2])
  
ans = isBipartite(V, adj)
 
# returns 1 if bipartite graph is possible
if (ans):
    print("Yes")
     
# returns 0 if bipartite graph is not possible
else:
    print("No")
     
    # This code is contributed by divyesh072019.


C#
using System;
using System.Collections.Generic;
class GFG {
     
    static bool isBipartite(int V, List> adj)
    {
        
        // vector to store colour of vertex
        // assigning all to -1 i.e. uncoloured
        // colours are either 0 or 1
        // for understanding take 0 as red and 1 as blue
        int[] col = new int[V];
        Array.Fill(col, -1);
      
        // queue for BFS storing {vertex , colour}
        List> q = new List>();
      
        //loop incase graph is not connected
        for (int i = 0; i < V; i++) {
          
        // if not coloured
            if (col[i] == -1) {
              
            // colouring with 0 i.e. red
                q.Add(new Tuple(i, 0));
                col[i] = 0;
              
                while (q.Count > 0) {
                    Tuple p = q[0];
                    q.RemoveAt(0);
                  
                    //current vertex
                    int v = p.Item1;
                    
                    // colour of current vertex
                    int c = p.Item2;
                      
                    // traversing vertexes connected to current vertex
                    foreach(int j in adj[v])
                    {
                      
                        // if already coloured with parent vertex color
                        // then bipartite graph is not possible
                        if (col[j] == c)
                            return false;
                      
                        // if uncoloured
                        if (col[j] == -1)
                        {
                            
                        // colouring with opposite color to that of parent
                            col[j] = (c==1) ? 0 : 1;
                            q.Add(new Tuple(j, col[j]));
                        }
                    }
                }
            }
        }
        
        // if all vertexes are coloured such that
        // no two connected vertex have same colours
        return true;
    }
     
  static void Main() {
    int V;
    V = 4 ;
      
    // adjacency list for storing graph
    List> adj = new List>();
      
    for(int i = 0; i < V; i++){
        adj.Add(new List());
    }
      
    adj[0].Add(1);
    adj[0].Add(3);
      
    adj[1].Add(0);
    adj[1].Add(2);
      
    adj[2].Add(1);
    adj[2].Add(3);
      
    adj[3].Add(0);
    adj[3].Add(2);
      
    bool ans = isBipartite(V, adj);
      
    // returns 1 if bipartite graph is possible
    if (ans)
        Console.WriteLine("Yes");
    
    // returns 0 if bipartite graph is not possible
    else
        Console.WriteLine("No");
  }
}
 
// This code is contributed by decode2207.


Javascript


C++
// C++ program to find out whether a given graph is Bipartite or not.
// Using recursion.
#include 
 
using namespace std;
#define V 4
 
 
bool colorGraph(int G[][V],int color[],int pos, int c){
     
    if(color[pos] != -1 && color[pos] !=c)
        return false;
         
    // color this pos as c and all its neighbours and 1-c
    color[pos] = c;
    bool ans = true;
    for(int i=0;i


Java
// Java program to find out whether
// a given graph is Bipartite or not.
// Using recursion.
class GFG
{
    static final int V = 4;
 
    static boolean colorGraph(int G[][],
                              int color[],
                              int pos, int c)
    {
        if (color[pos] != -1 &&
            color[pos] != c)
            return false;
 
        // color this pos as c and
        // all its neighbours as 1-c
        color[pos] = c;
        boolean ans = true;
        for (int i = 0; i < V; i++)
        {
            if (G[pos][i] == 1)
            {
                if (color[i] == -1)
                    ans &= colorGraph(G, color, i, 1 - c);
 
                if (color[i] != -1 && color[i] != 1 - c)
                    return false;
            }
            if (!ans)
                return false;
        }
        return true;
    }
 
    static boolean isBipartite(int G[][])
    {
        int[] color = new int[V];
        for (int i = 0; i < V; i++)
            color[i] = -1;
 
        // start is vertex 0;
        int pos = 0;
     
        // two colors 1 and 0
        return colorGraph(G, color, pos, 1);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int G[][] = { { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 },
                      { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 } };
 
        if (isBipartite(G))
            System.out.print("Yes");
        else
            System.out.print("No");
    }
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program to find out whether a given
# graph is Bipartite or not using recursion.
V = 4
 
def colorGraph(G, color, pos, c):
     
    if color[pos] != -1 and color[pos] != c:
        return False
         
    # color this pos as c and all its neighbours and 1-c
    color[pos] = c
    ans = True
    for i in range(0, V):
        if G[pos][i]:
            if color[i] == -1:
                ans &= colorGraph(G, color, i, 1-c)
                 
            if color[i] !=-1 and color[i] != 1-c:
                return False
          
        if not ans:
            return False
      
    return True
  
def isBipartite(G):
     
    color = [-1] * V
         
    #start is vertex 0
    pos = 0
    # two colors 1 and 0
    return colorGraph(G, color, pos, 1)
 
if __name__ == "__main__":
  
    G = [[0, 1, 0, 1],
         [1, 0, 1, 0],
         [0, 1, 0, 1],
         [1, 0, 1, 0]]
      
    if isBipartite(G): print("Yes")
    else: print("No")
 
# This code is contributed by Rituraj Jain


C#
// C# program to find out whether
// a given graph is Bipartite or not.
// Using recursion.
using System;
 
class GFG
{
    static readonly int V = 4;
 
    static bool colorGraph(int [,]G,
                           int []color,
                           int pos, int c)
    {
        if (color[pos] != -1 &&
            color[pos] != c)
            return false;
 
        // color this pos as c and
        // all its neighbours as 1-c
        color[pos] = c;
        bool ans = true;
        for (int i = 0; i < V; i++)
        {
            if (G[pos, i] == 1)
            {
                if (color[i] == -1)
                    ans &= colorGraph(G, color, i, 1 - c);
 
                if (color[i] != -1 && color[i] != 1 - c)
                    return false;
            }
            if (!ans)
                return false;
        }
        return true;
    }
 
    static bool isBipartite(int [,]G)
    {
        int[] color = new int[V];
        for (int i = 0; i < V; i++)
            color[i] = -1;
 
        // start is vertex 0;
        int pos = 0;
     
        // two colors 1 and 0
        return colorGraph(G, color, pos, 1);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int [,]G = {{ 0, 1, 0, 1 },
                    { 1, 0, 1, 0 },
                    { 0, 1, 0, 1 },
                    { 1, 0, 1, 0 }};
 
        if (isBipartite(G))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:

Yes

上述算法仅在图形连接时才有效。在上面的代码中,我们总是从源 0 开始,并假设从它访问顶点。一个重要的观察是没有边的图也是二分图。请注意,二分条件表示所有边都应该从一组到另一组。

我们可以扩展上面的代码来处理图未连接的情况。对于所有尚未访问的顶点,该想法在上述方法中重复调用。

C++

// C++ program to find out whether
// a given graph is Bipartite or not.
// It works for disconnected graph also.
#include 
 
using namespace std;
 
const int V = 4;
 
// This function returns true if
// graph G[V][V] is Bipartite, else false
bool isBipartiteUtil(int G[][V], int src, int colorArr[])
{
    colorArr[src] = 1;
 
    // Create a queue (FIFO) of vertex numbers a
    // nd enqueue source vertex for BFS traversal
    queue q;
    q.push(src);
 
    // Run while there are vertices in queue (Similar to
    // BFS)
    while (!q.empty()) {
        // Dequeue a vertex from queue ( Refer
        // http://goo.gl/35oz8 )
        int u = q.front();
        q.pop();
 
        // Return false if there is a self-loop
        if (G[u][u] == 1)
            return false;
 
        // 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] && colorArr[v] == -1) {
                // Assign alternate color to this
                // adjacent v of u
                colorArr[v] = 1 - colorArr[u];
                q.push(v);
            }
 
            // An edge from u to v exists and destination
            // v is colored with same color as u
            else if (G[u][v] && colorArr[v] == colorArr[u])
                return false;
        }
    }
 
    // If we reach here, then all adjacent vertices can
    // be colored with alternate color
    return true;
}
 
// Returns true if G[][] is Bipartite, else false
bool isBipartite(int G[][V])
{
    // Create a color array to store colors assigned to all
    // vertices. 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[V];
    for (int i = 0; i < V; ++i)
        colorArr[i] = -1;
 
    // This code is to handle disconnected graph
    for (int i = 0; i < V; i++)
        if (colorArr[i] == -1)
            if (isBipartiteUtil(G, i, colorArr) == false)
                return false;
 
    return true;
}
 
// Driver code
int main()
{
    int G[][V] = { { 0, 1, 0, 1 },
                   { 1, 0, 1, 0 },
                   { 0, 1, 0, 1 },
                   { 1, 0, 1, 0 } };
 
    isBipartite(G) ? cout << "Yes" : cout << "No";
    return 0;
}

Java

// JAVA Code to check whether a given
// graph is Bipartite or not
import java.util.*;
 
class Bipartite {
 
    public static int V = 4;
 
    // This function returns true if graph
    // G[V][V] is Bipartite, else false
    public static boolean
    isBipartiteUtil(int G[][], int src, int colorArr[])
    {
        colorArr[src] = 1;
 
        // Create a queue (FIFO) of vertex numbers and
        // enqueue source vertex for BFS traversal
        LinkedList q = new LinkedList();
        q.add(src);
 
        // Run while there are vertices in queue
        // (Similar to BFS)
        while (!q.isEmpty()) {
            // Dequeue a vertex from queue
            // ( Refer http://goo.gl/35oz8 )
            int u = q.getFirst();
            q.pop();
 
            // Return false if there is a self-loop
            if (G[u][u] == 1)
                return false;
 
            // 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.push(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;
    }
 
    // Returns true if G[][] is Bipartite, else false
    public static boolean isBipartite(int G[][])
    {
        // Create a color array to store colors assigned
        // to all vertices. 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;
 
        // This code is to handle disconnected graph
        for (int i = 0; i < V; i++)
            if (colorArr[i] == -1)
                if (isBipartiteUtil(G, i, colorArr)
                    == false)
                    return false;
 
        return true;
    }
 
    /* Driver code*/
    public static void main(String[] args)
    {
        int G[][] = { { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 },
                      { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 } };
 
        if (isBipartite(G))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Arnav Kr. Mandal.

Python3

# Python3 program to find out whether a
# given graph is Bipartite or not
 
 
class Graph():
 
    def __init__(self, V):
        self.V = V
        self.graph = [[0 for column in range(V)]
                      for row in range(V)]
 
        self.colorArr = [-1 for i in range(self.V)]
 
    # This function returns true if graph G[V][V]
    # is Bipartite, else false
    def isBipartiteUtil(self, src):
 
        # Create a color array to store colors
        # assigned to all vertices. Vertex
        # number is used as index in this array.
        # The value '-1' of self.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.
 
        # Assign first color to source
 
        # Create a queue (FIFO) of vertex numbers and
        # enqueue source vertex for BFS traversal
        queue = []
        queue.append(src)
 
        # Run while there are vertices in queue
        # (Similar to BFS)
        while queue:
 
            u = queue.pop()
 
            # Return false if there is a self-loop
            if self.graph[u][u] == 1:
                return False
 
            for v in range(self.V):
 
                # An edge from u to v exists and
                # destination v is not colored
                if (self.graph[u][v] == 1 and
                        self.colorArr[v] == -1):
 
                    # Assign alternate color to
                    # this adjacent v of u
                    self.colorArr[v] = 1 - self.colorArr[u]
                    queue.append(v)
 
                # An edge from u to v exists and destination
                # v is colored with same color as u
                elif (self.graph[u][v] == 1 and
                      self.colorArr[v] == self.colorArr[u]):
                    return False
 
        # If we reach here, then all adjacent
        # vertices can be colored with alternate
        # color
        return True
 
    def isBipartite(self):
        self.colorArr = [-1 for i in range(self.V)]
        for i in range(self.V):
            if self.colorArr[i] == -1:
                if not self.isBipartiteUtil(i):
                    return False
        return True
 
 
# Driver Code
g = Graph(4)
g.graph = [[0, 1, 0, 1],
           [1, 0, 1, 0],
           [0, 1, 0, 1],
           [1, 0, 1, 0]]
 
print ("Yes" if g.isBipartite() else "No")
 
# This code is contributed by Anshuman Sharma

C#

// C# Code to check whether a given
// graph is Bipartite or not
using System;
using System.Collections.Generic;
 
class GFG {
    public static int V = 4;
 
    // This function returns true if graph
    // G[V,V] is Bipartite, else false
    public static bool isBipartiteUtil(int[, ] G, int src,
                                       int[] colorArr)
    {
        colorArr[src] = 1;
 
        // Create a queue (FIFO) of vertex numbers and
        // enqueue source vertex for BFS traversal
        Queue q = new Queue();
        q.Enqueue(src);
 
        // Run while there are vertices in queue
        // (Similar to BFS)
        while (q.Count != 0) {
            // Dequeue a vertex from queue
            // ( Refer http://goo.gl/35oz8 )
            int u = q.Peek();
            q.Dequeue();
 
            // Return false if there is a self-loop
            if (G[u, u] == 1)
                return false;
 
            // 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.Enqueue(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;
    }
 
    // Returns true if G[,] is Bipartite,
    // else false
    public static bool isBipartite(int[, ] G)
    {
        // Create a color array to store
        // colors assigned to all vertices.
        // 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;
 
        // This code is to handle disconnected graph
        for (int i = 0; i < V; i++)
            if (colorArr[i] == -1)
                if (isBipartiteUtil(G, i, colorArr)
                    == false)
                    return false;
 
        return true;
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int[, ] G = { { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 },
                      { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 } };
 
        if (isBipartite(G))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by Rajput-Ji

Javascript


输出:

Yes

上述方法的时间复杂度与广度优先搜索相同。在上面的实现中是 O(V^2),其中 V 是顶点数。如果使用邻接表表示图,则复杂度变为 O(V+E)。

如果使用邻接列表表示图形,则时间复杂度将为 O(V+E)。

适用于连接图和断开图。

C++

#include 
using namespace std;
 
bool isBipartite(int V, vector adj[])
{
    // vector to store colour of vertex
    // assigning all to -1 i.e. uncoloured
    // colours are either 0 or 1
      // for understanding take 0 as red and 1 as blue
    vector col(V, -1);
 
    // queue for BFS storing {vertex , colour}
    queue > q;
   
      //loop incase graph is not connected
    for (int i = 0; i < V; i++) {
       
      //if not coloured
        if (col[i] == -1) {
           
          //colouring with 0 i.e. red
            q.push({ i, 0 });
            col[i] = 0;
           
            while (!q.empty()) {
                pair p = q.front();
                q.pop();
               
                  //current vertex
                int v = p.first;
                  //colour of current vertex
                int c = p.second;
                 
                  //traversing vertexes connected to current vertex
                for (int j : adj[v]) {
                   
                      //if already coloured with parent vertex color
                      //then bipartite graph is not possible
                    if (col[j] == c)
                        return 0;
                   
                      //if uncoloured
                    if (col[j] == -1) {
                      //colouring with opposite color to that of parent
                        col[j] = (c) ? 0 : 1;
                        q.push({ j, col[j] });
                    }
                }
            }
        }
    }
    //if all vertexes are coloured such that
      //no two connected vertex have same colours
    return 1;
}
 
 
// { Driver Code Starts.
int main()
{
 
    int V, E;
    V = 4 , E = 8;
      //adjacency list for storing graph
    vector adj[V];
      adj[0] = {1,3};
      adj[1] = {0,2};
      adj[2] = {1,3};
      adj[3] = {0,2};
     
   
    bool ans = isBipartite(V, adj);
    //returns 1 if bipartite graph is possible
      if (ans)
        cout << "Yes\n";
    //returns 0 if bipartite graph is not possible
      else
        cout << "No\n";
 
    return 0;
}
 // code Contributed By Devendra Kolhe

Java

import java.util.*;
 
public class GFG{
     
    static class Pair{
        int first, second;
         
        Pair(int f, int s){
            first = f;
            second = s;
        }
    }
     
    static boolean isBipartite(int V, ArrayList> adj)
    {
       
        // vector to store colour of vertex
        // assigning all to -1 i.e. uncoloured
        // colours are either 0 or 1
        // for understanding take 0 as red and 1 as blue
        int col[] = new int[V];
        Arrays.fill(col, -1);
     
        // queue for BFS storing {vertex , colour}
        Queue q = new LinkedList();
     
        //loop incase graph is not connected
        for (int i = 0; i < V; i++) {
         
        // if not coloured
            if (col[i] == -1) {
             
            // colouring with 0 i.e. red
                q.add(new Pair(i, 0));
                col[i] = 0;
             
                while (!q.isEmpty()) {
                    Pair p = q.peek();
                    q.poll();
                 
                    //current vertex
                    int v = p.first;
                   
                    // colour of current vertex
                    int c = p.second;
                     
                    // traversing vertexes connected to current vertex
                    for (int j : adj.get(v))
                    {
                     
                        // if already coloured with parent vertex color
                        // then bipartite graph is not possible
                        if (col[j] == c)
                            return false;
                     
                        // if uncoloured
                        if (col[j] == -1)
                        {
                           
                        // colouring with opposite color to that of parent
                            col[j] = (c==1) ? 0 : 1;
                            q.add(new Pair(j, col[j]));
                        }
                    }
                }
            }
        }
       
        // if all vertexes are coloured such that
        // no two connected vertex have same colours
        return true;
    }
     
    // Driver Code Starts.
    public static void main(String args[])
    {
     
        int V, E;
        V = 4 ;
        E = 8;
         
        // adjacency list for storing graph
        ArrayList> adj = new ArrayList>();
         
        for(int i = 0; i < V; i++){
            adj.add(new ArrayList());
        }
         
        adj.get(0).add(1);
        adj.get(0).add(3);
         
        adj.get(1).add(0);
        adj.get(1).add(2);
         
        adj.get(2).add(1);
        adj.get(2).add(3);
         
        adj.get(3).add(0);
        adj.get(3).add(2);
         
        boolean ans = isBipartite(V, adj);
         
        // returns 1 if bipartite graph is possible
        if (ans)
            System.out.println("Yes");
       
        // returns 0 if bipartite graph is not possible
        else
            System.out.println("No");
     
    }
}
 
// This code is contributed by adityapande88.

Python3

def isBipartite(V, adj):
    # vector to store colour of vertex
    # assigning all to -1 i.e. uncoloured
    # colours are either 0 or 1
    # for understanding take 0 as red and 1 as blue
    col = [-1]*(V)
   
    # queue for BFS storing {vertex , colour}
    q = []
   
    #loop incase graph is not connected
    for i in range(V):
       
        # if not coloured
        if (col[i] == -1):
           
            # colouring with 0 i.e. red
            q.append([i, 0])
            col[i] = 0
           
            while len(q) != 0:
                p = q[0]
                q.pop(0)
               
                # current vertex
                v = p[0]
                 
                # colour of current vertex
                c = p[1]
                   
                # traversing vertexes connected to current vertex
                for j in adj[v]:
                   
                    # if already coloured with parent vertex color
                    # then bipartite graph is not possible
                    if (col[j] == c):
                        return False
                   
                    # if uncoloured
                    if (col[j] == -1):
                       
                        # colouring with opposite color to that of parent
                        if c == 1:
                            col[j] = 0
                        else:
                            col[j] = 1
                        q.append([j, col[j]])
     
    # if all vertexes are coloured such that
    # no two connected vertex have same colours
    return True
 
V, E = 4, 8
 
# adjacency list for storing graph
adj = []
adj.append([1,3])
adj.append([0,2])
adj.append([1,3])
adj.append([0,2])
  
ans = isBipartite(V, adj)
 
# returns 1 if bipartite graph is possible
if (ans):
    print("Yes")
     
# returns 0 if bipartite graph is not possible
else:
    print("No")
     
    # This code is contributed by divyesh072019.

C#

using System;
using System.Collections.Generic;
class GFG {
     
    static bool isBipartite(int V, List> adj)
    {
        
        // vector to store colour of vertex
        // assigning all to -1 i.e. uncoloured
        // colours are either 0 or 1
        // for understanding take 0 as red and 1 as blue
        int[] col = new int[V];
        Array.Fill(col, -1);
      
        // queue for BFS storing {vertex , colour}
        List> q = new List>();
      
        //loop incase graph is not connected
        for (int i = 0; i < V; i++) {
          
        // if not coloured
            if (col[i] == -1) {
              
            // colouring with 0 i.e. red
                q.Add(new Tuple(i, 0));
                col[i] = 0;
              
                while (q.Count > 0) {
                    Tuple p = q[0];
                    q.RemoveAt(0);
                  
                    //current vertex
                    int v = p.Item1;
                    
                    // colour of current vertex
                    int c = p.Item2;
                      
                    // traversing vertexes connected to current vertex
                    foreach(int j in adj[v])
                    {
                      
                        // if already coloured with parent vertex color
                        // then bipartite graph is not possible
                        if (col[j] == c)
                            return false;
                      
                        // if uncoloured
                        if (col[j] == -1)
                        {
                            
                        // colouring with opposite color to that of parent
                            col[j] = (c==1) ? 0 : 1;
                            q.Add(new Tuple(j, col[j]));
                        }
                    }
                }
            }
        }
        
        // if all vertexes are coloured such that
        // no two connected vertex have same colours
        return true;
    }
     
  static void Main() {
    int V;
    V = 4 ;
      
    // adjacency list for storing graph
    List> adj = new List>();
      
    for(int i = 0; i < V; i++){
        adj.Add(new List());
    }
      
    adj[0].Add(1);
    adj[0].Add(3);
      
    adj[1].Add(0);
    adj[1].Add(2);
      
    adj[2].Add(1);
    adj[2].Add(3);
      
    adj[3].Add(0);
    adj[3].Add(2);
      
    bool ans = isBipartite(V, adj);
      
    // returns 1 if bipartite graph is possible
    if (ans)
        Console.WriteLine("Yes");
    
    // returns 0 if bipartite graph is not possible
    else
        Console.WriteLine("No");
  }
}
 
// This code is contributed by decode2207.

Javascript


输出
Yes

锻炼:
1. DFS算法可以用来检查图的二分性吗?如果是,如何?
解决方案 :

C++

// C++ program to find out whether a given graph is Bipartite or not.
// Using recursion.
#include 
 
using namespace std;
#define V 4
 
 
bool colorGraph(int G[][V],int color[],int pos, int c){
     
    if(color[pos] != -1 && color[pos] !=c)
        return false;
         
    // color this pos as c and all its neighbours and 1-c
    color[pos] = c;
    bool ans = true;
    for(int i=0;i

Java

// Java program to find out whether
// a given graph is Bipartite or not.
// Using recursion.
class GFG
{
    static final int V = 4;
 
    static boolean colorGraph(int G[][],
                              int color[],
                              int pos, int c)
    {
        if (color[pos] != -1 &&
            color[pos] != c)
            return false;
 
        // color this pos as c and
        // all its neighbours as 1-c
        color[pos] = c;
        boolean ans = true;
        for (int i = 0; i < V; i++)
        {
            if (G[pos][i] == 1)
            {
                if (color[i] == -1)
                    ans &= colorGraph(G, color, i, 1 - c);
 
                if (color[i] != -1 && color[i] != 1 - c)
                    return false;
            }
            if (!ans)
                return false;
        }
        return true;
    }
 
    static boolean isBipartite(int G[][])
    {
        int[] color = new int[V];
        for (int i = 0; i < V; i++)
            color[i] = -1;
 
        // start is vertex 0;
        int pos = 0;
     
        // two colors 1 and 0
        return colorGraph(G, color, pos, 1);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int G[][] = { { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 },
                      { 0, 1, 0, 1 },
                      { 1, 0, 1, 0 } };
 
        if (isBipartite(G))
            System.out.print("Yes");
        else
            System.out.print("No");
    }
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 program to find out whether a given
# graph is Bipartite or not using recursion.
V = 4
 
def colorGraph(G, color, pos, c):
     
    if color[pos] != -1 and color[pos] != c:
        return False
         
    # color this pos as c and all its neighbours and 1-c
    color[pos] = c
    ans = True
    for i in range(0, V):
        if G[pos][i]:
            if color[i] == -1:
                ans &= colorGraph(G, color, i, 1-c)
                 
            if color[i] !=-1 and color[i] != 1-c:
                return False
          
        if not ans:
            return False
      
    return True
  
def isBipartite(G):
     
    color = [-1] * V
         
    #start is vertex 0
    pos = 0
    # two colors 1 and 0
    return colorGraph(G, color, pos, 1)
 
if __name__ == "__main__":
  
    G = [[0, 1, 0, 1],
         [1, 0, 1, 0],
         [0, 1, 0, 1],
         [1, 0, 1, 0]]
      
    if isBipartite(G): print("Yes")
    else: print("No")
 
# This code is contributed by Rituraj Jain

C#

// C# program to find out whether
// a given graph is Bipartite or not.
// Using recursion.
using System;
 
class GFG
{
    static readonly int V = 4;
 
    static bool colorGraph(int [,]G,
                           int []color,
                           int pos, int c)
    {
        if (color[pos] != -1 &&
            color[pos] != c)
            return false;
 
        // color this pos as c and
        // all its neighbours as 1-c
        color[pos] = c;
        bool ans = true;
        for (int i = 0; i < V; i++)
        {
            if (G[pos, i] == 1)
            {
                if (color[i] == -1)
                    ans &= colorGraph(G, color, i, 1 - c);
 
                if (color[i] != -1 && color[i] != 1 - c)
                    return false;
            }
            if (!ans)
                return false;
        }
        return true;
    }
 
    static bool isBipartite(int [,]G)
    {
        int[] color = new int[V];
        for (int i = 0; i < V; i++)
            color[i] = -1;
 
        // start is vertex 0;
        int pos = 0;
     
        // two colors 1 and 0
        return colorGraph(G, color, pos, 1);
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        int [,]G = {{ 0, 1, 0, 1 },
                    { 1, 0, 1, 0 },
                    { 0, 1, 0, 1 },
                    { 1, 0, 1, 0 }};
 
        if (isBipartite(G))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by 29AjayKumar

Javascript


输出
Yes