解空间结构:
子集树
代码:
public class MaxTuan {
// 几个顶点
static int n;
// 顶点的邻接矩阵
static int[][] a;
// 当前解
static int[] x;
// 当前最优解
static int[] bestx;
// 当前顶点个数
static int cn;
// 当前最优顶点个数
static int bestn;
// 初始化
public static int maxTuan(int nn,int[][] aa)
{
n = nn;
a = aa;
x = new int[n + 1];
bestx = x;
cn = 0;
bestn = 0;
backtrace(1);
return bestn;
}
public static void backtrace(int i) {
if(i > n) {
for(int j = 1;j <=n;j++) {
bestx[j] = x[j];
System.out.print(x[j] +" ");
}
System.out.println();
bestn = cn;
return;
}
else {
boolean ok = true;
for(int j = 1;j < i;j++) {
// 已入团或者与已入团的顶点没有边
if(x[j]==1&&a[i][j]==0) {
ok = false;
break;
}
}
// 进入左子树
if(ok) {
x[i] = 1;
cn ++;
backtrace(i + 1);
x[i] = 0;
cn --;
}
// 进入右子树
if(cn + n -i > bestn) {
x[i] = 0;
backtrace(i + 1);
}
}
}
public static void main(String[] args) {
int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,0,1,1},{-1,1,0,1,0,1},{-1,0,1,0,0,1},{-1,1,0,0,0,1},{-1,1,1,1,1,0}};//a的下标从1开始,-1的值无用
int n=5;
Maxclique m=new Maxclique();
System.out.println("图G的最大团解向量为:");
System.out.println("图G的最大团顶点数为:"+m.maxclique(n, a));
}
}
结果截图: