#include "stdio.h"
#include "stdlib.h"
#define MAX 10
int a[6][6]; //图的邻接矩阵
int x[MAX]; //当前解向量空间
int cn = 0; //当前团中的顶点个数
int bestn = 0; //最大团中的顶点个数
int bestx[MAX]; //最优解向量空间
int n; //图中的顶点个数
//搜索到第i个顶点
void backtrack(int i)
{
if(i>n)
{
int j;
for(j=1; j<=n; j++)
bestx[j] = x[j];
bestn = cn;
return;
}
int j;
int ok = 1;
for(j=1; j<i; j++) //检查当前顶点是否与之前被加入团中的顶点连接
if(x[j] && !a[i][j]) //如果当前顶点与已加入的顶点不相邻,则不属于最大团
{
ok = 0;
break;
}
if(ok) //如果连接,则搜索左子树
{
x[i] = 1; //该顶点加入团
cn++; //当前团中的顶点数增加
backtrack(i+1); //检查下一个顶点
x[i] = 0; //回到上一层
cn--;
}
//如果当前团中的顶点数+图中剩余顶点数>=最优值,则可能产生最优值,搜素右子树
if(cn + n - i >= bestn)
{
x[i] = 0; //该顶点不加人
backtrack(i+1); //检查下一个顶点
}
}
void maxClique(int a1[][6], int n1)
{
n = n1;
int i, j;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
a[i][j] = a1[i][j];
backtrack(1);
}
int main(){
int n1 = 5;
int i, j;
int a1[6][6] = {
{0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 1},
{0, 1, 0, 1, 0, 1},
{0, 0, 1, 0, 0, 1},
{0, 1, 0, 0, 0, 1},
{0, 1, 1, 1, 1, 0}
};
maxClique(a1, n1);
printf("图的邻接矩阵为:\n");
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
printf("图的最大团解向量为:\n");
for(i=1; i<=n; i++)
printf("%d ", bestx[i]);
printf("\n");
printf("最大团中的顶点个数为:%d\n", bestn);
return 0;
}
最大团问题
最新推荐文章于 2020-08-24 20:48:29 发布