5-7 最大团问题(回溯)

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
*/

四、运行截图

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清木!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值