5-7 最大团问题
一、问题描述
给定无向图G=(V,E)。如果U包含于V,且对任意u,v∈U,有(u , v)∈E则称U是G的完全子图。
完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。
G的最大团是指G中所含顶点数最多的团。
二、分析
三、代码
#include<iostream>
#include<string.h>
#define INF 0x3f3f3f3f
using namespace std;
int a[10][10];
int n;//顶点数
int x[10];//当前解
int bestx[10];//当前最优解
int cn;//当前顶点数
int bestn;//当前最大顶点数
void Print(){
for(int i=1;i<=n;i++)
cout<<bestx[i]<<" ";
cout<<endl;
}
//子集树
void BackTrack(int t){
if(t>n){//到达叶结点
for(int j=1;j<=n;j++){
bestx[j]=x[j];
}
bestn=cn;
Print();
return;
}
else{//检查顶点t与当前团的连接
bool ok = true;
for(int i=1;i<t;i++){
if(x[i] == 1 && a[i][t]!=1){//i与t不相连
ok=false;
break;
}
}
if(ok){//进入左子树
x[t]=1;
cn++;
BackTrack(t+1);
cn--;
}
if(cn+n-t>bestn){//进入右子树
x[t]=0;
BackTrack(t+1);
}
}
}
int main(){
int t;//边数
int x,y;
memset(a,INF,sizeof(a));
cin>>n>>t;
for(int i=1;i<=t;i++){
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;//无向图
}
BackTrack(1);
cout<<"bestn="<<bestn<<endl;
return 0;
}
/*
5
7
1 2
1 5
1 4
2 3
2 5
3 5
4 5
*/