java 着色问题 回溯算法,算法java實現--回溯法--圖的m着色問題

/**

* 着色問題

* @author Lican

**/

public classColoring {int n;//圖的頂點數

int m;//可用顏色數

int[][] a;//圖的鄰接矩陣

int[] x;//當前解

long sum;//當前已找到的可m着色方案數

public long mcoloring(int mm,int nn,int[][] aa){

n=nn;

a=aa;

x=new int[n+1];

m=mm;

sum=0;

backtrack(1);returnsum;

}public void backtrack(intt){if(t>n){

sum++;for(int i=1;i<=n;i++)

System.out.print(x[i]+" ");

System.out.println();

}else{for(int i=1;i<=m;i++){

x[t]=i;if(ok(t))//剪枝函數

backtrack(t+1);

x[t]=0;

}

}

}public boolean ok(intk){for(int j=1;j<=n;j++){if(a[k][j]==1&&x[j]==x[k])//某條邊的兩個頂點着不同顏色;a[k][j]=1表示某條邊(即邊集E中的邊)

return false;

}return true;

}public static voidmain(String[] args) {//int n=5;//int m=3;//int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,0,1,1,0,1},{-1,0,1,0,1,0}};//int n=4;//int m=4;//int[][] a={{-1,-1,-1,-1,-1},{-1,0,1,1,0},{-1,1,0,1,1},{-1,1,1,0,1},{-1,0,1,1,0}};

int n=5;int m=5;int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,1,1,1,0,1},{-1,0,1,0,1,0}};

Coloring c=newColoring();

System.out.println("着色方案如下:");long sum=c.mcoloring(m, n, a);

System.out.println("可行的着色方案數目為:"+sum);

}

}/*測試數據:

int n=4;

int m=4;

int[][] a={{-1,-1,-1,-1,-1},{-1,0,1,1,0},{-1,1,0,1,1},{-1,1,1,0,1},{-1,0,1,1,0}};

輸出:

着色方案如下:

1 2 3 1

1 2 3 4

1 2 4 1

1 2 4 3

1 3 2 1

1 3 2 4

1 3 4 1

1 3 4 2

1 4 2 1

1 4 2 3

1 4 3 1

1 4 3 2

2 1 3 2

2 1 3 4

2 1 4 2

2 1 4 3

2 3 1 2

2 3 1 4

2 3 4 1

2 3 4 2

2 4 1 2

2 4 1 3

2 4 3 1

2 4 3 2

3 1 2 3

3 1 2 4

3 1 4 2

3 1 4 3

3 2 1 3

3 2 1 4

3 2 4 1

3 2 4 3

3 4 1 2

3 4 1 3

3 4 2 1

3 4 2 3

4 1 2 3

4 1 2 4

4 1 3 2

4 1 3 4

4 2 1 3

4 2 1 4

4 2 3 1

4 2 3 4

4 3 1 2

4 3 1 4

4 3 2 1

4 3 2 4

可行的着色方案數目為:48

=======================================================

測試數據

int n=5;

int m=3;

int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,0,1,1,0,1},{-1,0,1,0,1,0}};

輸出:

着色方案如下:

1 2 3 1 3

1 3 2 1 2

2 1 3 2 3

2 3 1 2 1

3 1 2 3 2

3 2 1 3 1

可行的着色方案數目為:6

=================================================================

測試數據

int n=5;

int m=5;

int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,1,1,1,0,1},{-1,0,1,0,1,0}};

輸出:

着色方案如下:

1 2 3 4 1

1 2 3 4 3

1 2 3 4 5

1 2 3 5 1

1 2 3 5 3

1 2 3 5 4

1 2 4 3 1

1 2 4 3 4

1 2 4 3 5

1 2 4 5 1

1 2 4 5 3

1 2 4 5 4

1 2 5 3 1

1 2 5 3 4

1 2 5 3 5

1 2 5 4 1

1 2 5 4 3

1 2 5 4 5

1 3 2 4 1

1 3 2 4 2

1 3 2 4 5

1 3 2 5 1

1 3 2 5 2

1 3 2 5 4

1 3 4 2 1

1 3 4 2 4

1 3 4 2 5

1 3 4 5 1

1 3 4 5 2

1 3 4 5 4

1 3 5 2 1

1 3 5 2 4

1 3 5 2 5

1 3 5 4 1

1 3 5 4 2

1 3 5 4 5

1 4 2 3 1

1 4 2 3 2

1 4 2 3 5

1 4 2 5 1

1 4 2 5 2

1 4 2 5 3

1 4 3 2 1

1 4 3 2 3

1 4 3 2 5

1 4 3 5 1

1 4 3 5 2

1 4 3 5 3

1 4 5 2 1

1 4 5 2 3

1 4 5 2 5

1 4 5 3 1

1 4 5 3 2

1 4 5 3 5

1 5 2 3 1

1 5 2 3 2

1 5 2 3 4

1 5 2 4 1

1 5 2 4 2

1 5 2 4 3

1 5 3 2 1

1 5 3 2 3

1 5 3 2 4

1 5 3 4 1

1 5 3 4 2

1 5 3 4 3

1 5 4 2 1

1 5 4 2 3

1 5 4 2 4

1 5 4 3 1

1 5 4 3 2

1 5 4 3 4

2 1 3 4 2

2 1 3 4 3

2 1 3 4 5

2 1 3 5 2

2 1 3 5 3

2 1 3 5 4

2 1 4 3 2

2 1 4 3 4

2 1 4 3 5

2 1 4 5 2

2 1 4 5 3

2 1 4 5 4

2 1 5 3 2

2 1 5 3 4

2 1 5 3 5

2 1 5 4 2

2 1 5 4 3

2 1 5 4 5

2 3 1 4 1

2 3 1 4 2

2 3 1 4 5

2 3 1 5 1

2 3 1 5 2

2 3 1 5 4

2 3 4 1 2

2 3 4 1 4

2 3 4 1 5

2 3 4 5 1

2 3 4 5 2

2 3 4 5 4

2 3 5 1 2

2 3 5 1 4

2 3 5 1 5

2 3 5 4 1

2 3 5 4 2

2 3 5 4 5

2 4 1 3 1

2 4 1 3 2

2 4 1 3 5

2 4 1 5 1

2 4 1 5 2

2 4 1 5 3

2 4 3 1 2

2 4 3 1 3

2 4 3 1 5

2 4 3 5 1

2 4 3 5 2

2 4 3 5 3

2 4 5 1 2

2 4 5 1 3

2 4 5 1 5

2 4 5 3 1

2 4 5 3 2

2 4 5 3 5

2 5 1 3 1

2 5 1 3 2

2 5 1 3 4

2 5 1 4 1

2 5 1 4 2

2 5 1 4 3

2 5 3 1 2

2 5 3 1 3

2 5 3 1 4

2 5 3 4 1

2 5 3 4 2

2 5 3 4 3

2 5 4 1 2

2 5 4 1 3

2 5 4 1 4

2 5 4 3 1

2 5 4 3 2

2 5 4 3 4

3 1 2 4 2

3 1 2 4 3

3 1 2 4 5

3 1 2 5 2

3 1 2 5 3

3 1 2 5 4

3 1 4 2 3

3 1 4 2 4

3 1 4 2 5

3 1 4 5 2

3 1 4 5 3

3 1 4 5 4

3 1 5 2 3

3 1 5 2 4

3 1 5 2 5

3 1 5 4 2

3 1 5 4 3

3 1 5 4 5

3 2 1 4 1

3 2 1 4 3

3 2 1 4 5

3 2 1 5 1

3 2 1 5 3

3 2 1 5 4

3 2 4 1 3

3 2 4 1 4

3 2 4 1 5

3 2 4 5 1

3 2 4 5 3

3 2 4 5 4

3 2 5 1 3

3 2 5 1 4

3 2 5 1 5

3 2 5 4 1

3 2 5 4 3

3 2 5 4 5

3 4 1 2 1

3 4 1 2 3

3 4 1 2 5

3 4 1 5 1

3 4 1 5 2

3 4 1 5 3

3 4 2 1 2

3 4 2 1 3

3 4 2 1 5

3 4 2 5 1

3 4 2 5 2

3 4 2 5 3

3 4 5 1 2

3 4 5 1 3

3 4 5 1 5

3 4 5 2 1

3 4 5 2 3

3 4 5 2 5

3 5 1 2 1

3 5 1 2 3

3 5 1 2 4

3 5 1 4 1

3 5 1 4 2

3 5 1 4 3

3 5 2 1 2

3 5 2 1 3

3 5 2 1 4

3 5 2 4 1

3 5 2 4 2

3 5 2 4 3

3 5 4 1 2

3 5 4 1 3

3 5 4 1 4

3 5 4 2 1

3 5 4 2 3

3 5 4 2 4

4 1 2 3 2

4 1 2 3 4

4 1 2 3 5

4 1 2 5 2

4 1 2 5 3

4 1 2 5 4

4 1 3 2 3

4 1 3 2 4

4 1 3 2 5

4 1 3 5 2

4 1 3 5 3

4 1 3 5 4

4 1 5 2 3

4 1 5 2 4

4 1 5 2 5

4 1 5 3 2

4 1 5 3 4

4 1 5 3 5

4 2 1 3 1

4 2 1 3 4

4 2 1 3 5

4 2 1 5 1

4 2 1 5 3

4 2 1 5 4

4 2 3 1 3

4 2 3 1 4

4 2 3 1 5

4 2 3 5 1

4 2 3 5 3

4 2 3 5 4

4 2 5 1 3

4 2 5 1 4

4 2 5 1 5

4 2 5 3 1

4 2 5 3 4

4 2 5 3 5

4 3 1 2 1

4 3 1 2 4

4 3 1 2 5

4 3 1 5 1

4 3 1 5 2

4 3 1 5 4

4 3 2 1 2

4 3 2 1 4

4 3 2 1 5

4 3 2 5 1

4 3 2 5 2

4 3 2 5 4

4 3 5 1 2

4 3 5 1 4

4 3 5 1 5

4 3 5 2 1

4 3 5 2 4

4 3 5 2 5

4 5 1 2 1

4 5 1 2 3

4 5 1 2 4

4 5 1 3 1

4 5 1 3 2

4 5 1 3 4

4 5 2 1 2

4 5 2 1 3

4 5 2 1 4

4 5 2 3 1

4 5 2 3 2

4 5 2 3 4

4 5 3 1 2

4 5 3 1 3

4 5 3 1 4

4 5 3 2 1

4 5 3 2 3

4 5 3 2 4

5 1 2 3 2

5 1 2 3 4

5 1 2 3 5

5 1 2 4 2

5 1 2 4 3

5 1 2 4 5

5 1 3 2 3

5 1 3 2 4

5 1 3 2 5

5 1 3 4 2

5 1 3 4 3

5 1 3 4 5

5 1 4 2 3

5 1 4 2 4

5 1 4 2 5

5 1 4 3 2

5 1 4 3 4

5 1 4 3 5

5 2 1 3 1

5 2 1 3 4

5 2 1 3 5

5 2 1 4 1

5 2 1 4 3

5 2 1 4 5

5 2 3 1 3

5 2 3 1 4

5 2 3 1 5

5 2 3 4 1

5 2 3 4 3

5 2 3 4 5

5 2 4 1 3

5 2 4 1 4

5 2 4 1 5

5 2 4 3 1

5 2 4 3 4

5 2 4 3 5

5 3 1 2 1

5 3 1 2 4

5 3 1 2 5

5 3 1 4 1

5 3 1 4 2

5 3 1 4 5

5 3 2 1 2

5 3 2 1 4

5 3 2 1 5

5 3 2 4 1

5 3 2 4 2

5 3 2 4 5

5 3 4 1 2

5 3 4 1 4

5 3 4 1 5

5 3 4 2 1

5 3 4 2 4

5 3 4 2 5

5 4 1 2 1

5 4 1 2 3

5 4 1 2 5

5 4 1 3 1

5 4 1 3 2

5 4 1 3 5

5 4 2 1 2

5 4 2 1 3

5 4 2 1 5

5 4 2 3 1

5 4 2 3 2

5 4 2 3 5

5 4 3 1 2

5 4 3 1 3

5 4 3 1 5

5 4 3 2 1

5 4 3 2 3

5 4 3 2 5

可行的着色方案數目為:360*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值