图的m着色问题(回溯法求解)

图的m着色问题(回溯法)

给定无向连通图和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。 
若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这个数m为这个图的色数。 
求一个图的色数m称为图的m可着色优化问题。给定一个图以及m种颜色,请计算出涂色方案数。

import java.util.*;
public class mzhuose {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int [][] a=new int[100][100];
		int [] b=new int[100];
		System.out.println("请输入点的数目和边的数目");
		int n=in.nextInt();
		int m=in.nextInt();
		System.out.println("边的连接");
		for(int i=0;i<m;i++)
		{
			int x=in.nextInt();
			int y=in.nextInt();
			a[x][y]=1;
			a[y][x]=1;//1代表连接
		}
		int t=n;
		b[0]=100;
		trackback(a,b,m,n,t);//回溯
		System.out.println(b[0]);

	}

	private static void trackback(int[][] a, int[] b, int m, int n,int t) {
		int tmp=n;
		int state=0,i,j;
		if(tmp<=0)
		{
			int temp=b[1];
			for(int r=1;r<=t;r++)
			{
				if(temp<b[r])
					temp=b[r];
				
			}
			if(temp<b[0])//b[0]代表最小的颜色,temp代表此次的颜色种数
				b[0]=temp;
			return ;
		}
		for( i=1;i<=t;i++)//颜色
		{
			state=0;
			b[tmp]=i;
			for( j=1;j<=t;j++)//边的连接
			{
				
				if(a[tmp][j]==1&&b[j]!=b[tmp])
				{
					continue;//trackback(a,b,m,n-1,t);
				}
				else if(b[j]==b[tmp]&&a[tmp][j]==1)
				{
					if(j==tmp)//如果是本身与自身的连接那么不管
						continue;
					state=1;
					break;
				}
			}
			if(state!=1)
			{
				
				trackback(a,b,m,n-1,t);
			}
		}
		
	}

}

猜你喜欢

转载自blog.csdn.net/cx1165597739/article/details/80716188