回溯-图的着色问题

图的着色问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 1  解决: 1
[提交][状态][讨论版]

题目描述

        给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色?
        这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
        编程计算:给定图G=(V, E)和m种不同的颜色,找出所有不同的着色法和着色总数。

输入

第一行是顶点的个数n(2≤n≤10),边数k,颜色数m(1≤m≤n)。
接下来是顶点之间的相互关系:a b
表示a和b相邻。

输出

输出着色方案总数。

样例输入

5 8 4
1 3
1 2
1 4
2 3
2 4
2 5
3 4
4 5

样例输出

48
import java.util.*;
public class 图的着色 {
	static int v,e,c,sum=0;;    				//定点数、边数、颜色数
	static int[][] graph=new int[100][100]; 	//记录无向图的顶点
	static int[] color=new int[100];           //记录颜色
	public static boolean ok(int k) {
		for(int i=1;i<=v;i++) {
			if(graph[k][i]==1&&color[i]==color[k])
				return false;
		}
		return true;
	}
	public static void backstrack(int t) {
		if(t>v){
			sum++;
			return;
		}
		for(int i=1;i<=c;i++) {
			color[t]=i;
			if(ok(t))
				backstrack(t+1);
			color[t]=0;
		}
	}
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int x,y;
		v=in.nextInt();
		e=in.nextInt();
		c=in.nextInt();
		for(int i=1;i<=v;i++)
			for(int j=1;j<=v;j++)
				graph[i][j]=0;
		for(int i=1;i<=e;i++) {
			x=in.nextInt();
			y=in.nextInt();
			graph[x][y]=1;
			graph[y][x]=1;
		}
		for(int i=0;i<=v;i++)
			color[i]=0;
		backstrack(1);
		System.out.println(sum);
	}
}

猜你喜欢

转载自blog.csdn.net/zw159357/article/details/79672649
今日推荐