最大团问题,想要求出最大团的所有可能解,但运行程序后只出来一种可能解
给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。# include<stdio.h>
# define N 5
int edge[N][N]={
{0,1,0,1,1}, //0表示两点之间不相连,1表示两点之间相连
{1,0,1,0,1},
{0,1,0,0,1},
{1,0,0,0,1},
{1,1,1,1,0},
};
int x[N],best[N];
int bestm=0,m=0,max=0;
int place(int k)
{
for(int i=0;i<k;i++)
{
if(x[k]&&edge[i][k]!=1)
return 0;
}
return 1;
}
void print()
{
if(m>=bestm)
{
bestm=m;
for(int i=0;i<N;i++)
{
best[i]=x[i];
}
}
}
void backtrack(int t)
{
if(t>=N)
{
print();
return;
}
for(int i=0;i<=1;i++)
{
x[t]=i;
if(i==0)
backtrack(t+1);
else
{
if(place(t))
{
x[t]=1;
m++;
backtrack(t+1);
m--;
}
}
}
}
void main()
{
backtrack(0);
printf("最大团顶点数:%d\n",bestm);
printf("最大团:");
for(int i=0;i<N;i++)
printf("%d ",best[i]);
printf("\n");
}