zoukankan      html  css  js  c++  java
  • *Check whether a given graph is Bipartite or not

    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.

    Bipartite1

    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.

    Bipartite2

    It is not possible to color a cycle graph with odd cycle using two colors.
    Bipartite3

    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).

     

  • 相关阅读:
    论抱怨
    GitHub开源的10个超棒后台管理面板
    RESTful API 最佳实践
    理解RESTful架构
    redis 数据类型详解 以及 redis适用场景场合
    redis的应用场景 为什么用redis
    composer install 出现的问题
    什么是反向代理
    电脑 DNS纪要
    ajax请求处理概要
  • 原文地址:https://www.cnblogs.com/hygeia/p/5159203.html
Copyright © 2011-2022 走看看