您的位置:首页 > 其它

最大团问题

2015-10-17 12:48 260 查看
#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: