zoukankan      html  css  js  c++  java
  • 二分图判定

    二分图判定 给定一个具有n个顶点的图,要给每个顶点染色,并且要使相邻的顶点颜色不同,问是否最多能用两种颜色进行染色?题目保证没有重环和自环。

    /*
    用邻接表深度遍历
    
    */
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Test {
        //图的顶点数,总边数
        static int V, E;
        //存储所有的边,大小为顶点数
        static ArrayList<Integer>[] Edges;
        //存储每个顶点的颜色
        static int[] color;
    
        public static void main(String[] args) {
            creatGraph();
            //题目未说明给定的是连通图,所有需要把所有顶点判定一遍
            for (int i = 0; i < V; i++) {
                if (color[i] == 0) {
                    if (!dfs(i, 1)) {
                        System.out.println("No");
                        return;
                    }
                }
            }
            System.out.println("Yes");
        }
    
        static boolean dfs(int v, int c) {
            color[v] = c;
            for (int i = 0; i < Edges[v].size(); i++) {
                if (color[Edges[v].get(i)] == 0) {
                    return dfs(Edges[v].get(i), -c);
                } else if (color[Edges[v].get(i)] == c)
                    return false;
            }
            return true;
        }
    
        static void creatGraph() {
            Scanner sc = new Scanner(System.in);
            V = sc.nextInt();
            E = sc.nextInt();
            color = new int[V];
            Edges = new ArrayList[V];
            for (int i = 0; i < V; i++) {
                Edges[i] = new ArrayList<Integer>();
            }
            for (int i = 0; i < E; i++) {
                int u = sc.nextInt();
                int v = sc.nextInt();
                Edges[u].add(v);
                Edges[v].add(u);
            }
        }
    }
    
     
    /*
    用邻接矩阵深度遍历
    
    */
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Test {
        //图的顶点数,总边数
        static int V, E;
        //存储所有的边,大小为顶点数
        static int[][] Edges;
        //存储每个顶点的颜色
        static int[] color;
    
        public static void main(String[] args) {
            creatGraph();
            //题目未说明给定的是连通图,所有需要把所有顶点判定一遍
            for (int i = 0; i < V; i++) {
                if (color[i] == 0) {
                    if (!dfs(i, 1)) {
                        System.out.println("No");
                        return;
                    }
                }
            }
            System.out.println("Yes");
        }
    
        static boolean dfs(int v, int c) {
            color[v] = c;
            for (int i = 0; i < V; i++) {
                if (Edges[v][i] < Integer.MAX_VALUE) {
                    if (color[i] == 0) {
                        return dfs(i, -c);
                    } else if (color[i] == c)
                        return false;
                }
            }
            return true;
        }
    
        static void creatGraph() {
            Scanner sc = new Scanner(System.in);
            V = sc.nextInt();
            E = sc.nextInt();
            color = new int[V];
            Edges = new int[V][V];
            for (int[] i : Edges)
                Arrays.fill(i, Integer.MAX_VALUE);
            for (int i = 0; i < E; i++) {
                int u = sc.nextInt();
                int v = sc.nextInt();
                Edges[u][v] = 1;
                Edges[v][u] = 1;
            }
        }
    }
  • 相关阅读:
    整个过程
    iframe 重新加载闪过白块问题
    C# 获得两日期之间所有月份(包括跨年)
    新手是个框,啥都往里装!---谨以此文致歉博友和自己的无知
    C# 和Java的foreach的不同用法
    终于鼓起勇气,辞掉了第一份工作
    Java Junit4测试功能
    自学Android的第一个小程序(小布局、button点击事件、toast弹出)
    JS--Div中数据滚动到最后一条重新从头开始滚动
    RelativeLayout与LinearLayout的区别
  • 原文地址:https://www.cnblogs.com/Alpharun/p/8653755.html
Copyright © 2011-2022 走看看