图着色问题

原文:
https://blog.csdn.net/qq_28888837/article/details/53284828

问题:图的m-着色判定问题
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

4个顶点的无向图
import java.util.Scanner;

public class Main {
    static int[][] e = new int[5][5]; //存储各个边的情况连同为1 不连为0
    static int[] state = new int[e.length]; //表示当前染色情况
    static int Colornum = 3;//共有几种颜色

    static void sear(int index) {//递归函数
        if (isOk(index)) {//判断当前状态能否满足条件
            if (index == e.length - 1) {//若已经染到最后一个节点则输出情况
                Show(index);
            } else {
                for (int i = 1; i <= Colornum; i++) {//将所有 的颜色情况给遍历 
                    state[index + 1] = i;//假如下一个染色,
                    sear(index + 1);//进入下次递归并且在递归的入口判断是否满足条件
                }
            }

        }
    }
//打印当前状态
    private static void Show(int index) {
        for (int i = 1; i <= index; i++) {
            System.out.println(i + "is " + "Color " + state[i]);
        }

        System.out.println();
    }
//判断是否能染色
    private static boolean isOk(int index) {
        for (int i = 1; i < index; i++) {
            if (e[index][i] == 1 && state[i] == state[index])//当两个节点是连同并且颜色一样则不满足返回false
                return false;
        }

        return true;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        //输入边的情况
        for (int i = 1; i <= n; i++) {
            int a = in.nextInt();
            int b = in.nextInt();
            e[a][b] = 1;
            e[b][a] = 1;
        }
        //从0开始递归,但0不是一个节点
        sear(0);
    }

}

你可能感兴趣的:(图着色问题)