最大团(dfs)

最大团问题是在无向图中找到包含顶点最多的完全子图。DFS算法用于解决此问题,通过检查每个节点是否与当前团内的所有节点相连,决定是否将其加入。只有当新节点与团内所有节点相邻,它才会被纳入团。该算法的目标是找到图中最大的这样的子集,即最大团。图例展示了不同图的最大团形态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:团就是最大完全子图。

给定无向图G=(V,E)。如果UV,且对任意u,vU 有(u,v)  E,则称U 是G 的完全子图。(U中任意两点间相连)

G 的完全子图U是G的团当且仅当U不包含在G 的更大的完全子图中,即U就是最大完全子图。

G 的最大团是指G中所含顶点数最多的团。

例如:

                              

                 (a)                                        (b)                             (c)                            (d)

图a是一个无向图,图b、c、d都是图a的团,且都是最大团。


tips:子集树搜索,只有当前点与团中所有的点都相连时,将该点加入团中。如果不将当前点加入团中,须满足剩下的所有的点加上当前团中的点比已知解更优。

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int>v;
int map[15][15];
int tmp[15];//1代表当前下标节点在团中 
int n,m;//定点从一开始编号 
int ans;
void dfs(int step,int cnt)
{
	if(step>n)
	{
		ans=cnt;
		v.clear();
		for(int i=1;i<=n;i++)
		{
			if(tmp[i])v.push_back(i);
		}
		return;
	}
	int flag=1;
	for(int i=1;i<step;i++)
	{
		if(tmp[i]==1&&map[step][i]==0){
		flag=0;break;
		}
	}
	if(flag)
	{
		tmp[step]=1;
		dfs(step+1,cnt+1); 
		tmp[step]=0;//别忘记回溯 
	 } 
	 
	 if(cnt+(n-step)>ans){
	 	tmp[step]=0;
	 	dfs(step+1,cnt);
	 }
}
int main()
{
	while(cin>>n>>m)
	{
		v.clear();ans=0;memset(map,0,sizeof(map));
		memset(tmp,0,sizeof(tmp));
		for(int i=1;i<=m;i++)
		{
			int x,y;cin>>x>>y;
			map[x][y]=map[y][x]=1;
		}
		dfs(1,0);	
		for(int i=0;i<v.size();i++)cout<<v[i]<<" ";cout<<endl; 
	 } 
	
	return 0;
 } 
 /*
5 7
1 2
1 4
1 5
2 5
4 5
2 3
5 3
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值