概述:

  最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题。最大团问题又称为最大独立集问题(Maximum Independent Set Problem)。目前,求解MCP问题的算法主要分为两类:确定性算法和启发式算法。确定性算法有回溯法、分支限界法等,启发式算法、蚁群算法、顺序贪婪算法、DLS-MC算法和智能搜索算法等。

问题描述:

  给定无向图G=(V,E),其中V是顶点集;E是V边集。如果U属于V,且对任意两个顶点u,v∈U有(u,v)∈E,则称U是G的完全子图。G的完全子图U是G的一个团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。

  如果U属于V,且对任意u,v∈U有(u,v)不属于E,则称U是G的空子图。G的空子图U是G的独立集当且仅当U不包含在G的更大的空子图中。G的最大独立集是G中所含顶点数最多的独立集。
  对于任一无向图G=(V,E),其补图G'=(V',E')定义为:V'=V,且(u,v)∈E'当且仅当(u,v)∉E。
  如果U是G的完全子图,则它也是G'的空子图,反之亦然。因此,G的团与G'的独立集之间存在一一对应的关系。特殊地,U是G的最大团当且仅当U是G'的最大独立集。

算法分析:

  无向图G的最大团和最大独立集问题都可以用回溯法在O(n2n)时间内解决。图G的最大团和最大独立集问题都可以看作是图G的顶点集V的子集选取问题。因此可用子集树表示问题的解空间。
  设当前扩展节点Z位于解空间树的第 层。在进入左子树前,必须确认从顶点 到已入选的顶点集中每一个顶点都有边相连。在进入右子树之前,必须确认还有足够多的可选择顶点使得算法有可能在右子树中找到更大的团。

算法描述:

 #include <fstream>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std; #define MAX_v 50 //定义一个最大顶点个数
typedef struct{
int a[MAX_v][MAX_v]; //无向图G的邻接矩阵
int v; //无向图G的顶点
int e; //无向图G的边
int x[]; //顶点与当前团的连接,x[i]=1 表示有连接——即x[i]==1代表在当前最大团的解内
int bestx[]; //当前最优解
int cnum; //当前团的顶点数目
int bestn; //最大团的顶点数目
}MCP; void Creat(MCP &G);
void Backtrack(MCP &G,int i); void Creat(MCP &G){
int i,j;
ifstream fin("data.txt");
if (!fin)
{
cout<<"不能打开文件:"<<"data.txt"<<endl;
exit();
}
fin>>G.v;
for (int i=;i<=G.v;i++)
for (int j=;j<=G.v;j++)
fin>>G.a[i][j];
for(i=;i<=G.v;i++) //初始化
{
G.bestx[i]=;
G.x[i]=;
G.bestn=;
G.cnum=;
}
cout<<"———回溯法求解最大团问题———"<<endl;
cout<<"输入初始化无向图矩阵为:"<<endl; //初始化
for(i=;i<=G.v;i++)
{
for(j=;j<=G.v;j++)
cout<<G.a[i][j]<<" ";
cout<<endl;
}
} void Backtrack(MCP &G,int i){
if (i>G.v){ //output()阶段
for (int j=; j<=G.v; j++)
G.bestx[j] = G.x[j]; //记录最优解
G.bestn =G.cnum;
return ;
}
//检查顶点i与当前团的连接
int OK = ;
for (int j=; j<=i ; j++)
if (G.x[j]&& G.a[i][j]==){ //G.x[j]:顶点j在当前解的最大团内;G.a[i][j]:待考察i顶点与最大团中前i-1个顶点间边的关系
//i不与j相连
OK = ;
break;
}
if (OK) { //进入左子树
G.x[i] = ;//把i加入团
G.cnum++;
Backtrack(G,i+);
G.x[i]=;
G.cnum-- ;
}
if (G.cnum+G.v- i>G.bestn){ //进入右子树——剪枝函数
G.x[i] = ;
Backtrack(G,i+);
}
} int main(){
MCP G;
Creat(G);
Backtrack(G,);
cout<<"最大团包含的顶点数为:"<<G.bestn<<endl;
cout<<"最大团方案为:( ";
for (int i=;i<=G.v;i++)
if(G.bestx[i]==){
cout<<i<<" ";
}
cout<<")"<<endl;
getch();
}

 注:问题在于这种解法只能求得其中的一个最大团解!

最大团问题百度百科:http://baike.baidu.com/view/7343867.htm

回溯法——最大团问题(Maximum Clique Problem, MCP)的更多相关文章

  1. 【最大团】【HDU1530】【Maximum Clique】

    先上最大团定义: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题,在国际上已有广泛的研究,而国内对MCP问题的研究则还处于起步 ...

  2. UVA - 524 Prime Ring Problem(dfs回溯法)

    UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & % ...

  3. HDU 1016 Prime Ring Problem (回溯法)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. UVA - 524 Prime Ring Problem(素数环)(回溯法)

    题意:输入n,把1~n组成个环,相邻两个数之和为素数. 分析:回溯法. #pragma comment(linker, "/STACK:102400000, 102400000") ...

  5. CF #296 (Div. 1) B. Clique Problem 贪心(构造)

    B. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  6. Maximum Clique

    Maximum Clique Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  7. B. Clique Problem(贪心)

    题目链接: B. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. [codeforces 528]B. Clique Problem

    [codeforces 528]B. Clique Problem 试题描述 The clique problem is one of the most well-known NP-complete ...

  9. CodeForces - 527D Clique Problem (图,贪心)

    Description The clique problem is one of the most well-known NP-complete problems. Under some simpli ...

随机推荐

  1. Mac机装Win7后 启动只见鼠标怎么办

    我有一台Mac机,用Bootcamp的方式装了Win7,昨天一按开机键发现只有鼠标没有别的. 当时按热启动无效,把笔记本盖子合上一会再开也无效,按关机键关掉再开也无效(这时是短按). 当时想是不是Ma ...

  2. javascript中按位操作的应用,如何快速取整 判断字符串是否是包含某字符串

    最近在看最基础的<javascript高级程序设计>看的灰常慢,看到按位运算这里,突然反思,这种鬼操作到底有什么实际的应用呢? 按位运算符有6个 & 按位与:a & b | ...

  3. 乌云主站所有漏洞综合分析&乌云主站漏洞统计

    作者:RedFree 最近的工作需要将乌云历史上比较有含金量的漏洞分析出来,顺便对其它的数据进行了下分析:统计往往能说明问题及分析事物的发展规律,所以就有了此文.(漏洞数据抓取自乌云主站,漏洞编号从1 ...

  4. php 基础入门篇之前言

    本人文笔不好,言辞简陋.没有华丽的语句,也没有精致的词语.仅仅是想给大家说一下,和大家一块学习,共同进步.学一点技术,找个吃饭的手段!接下来我会梳理一下知识,算是温故知新,同一时候也算是和大家一起在学 ...

  5. Vue 状态管理 Vuex

    1.概述 Vuex作为插件,管理和维护整个项目的组件状态. 2.安装vuex cnpm i --save vuex 3.vuex使用 github地址:https://github.com/MengF ...

  6. 用Volley-nullpointerexception

    public Request(int method, String url, Response.ErrorListener listener) { mMethod = method; mUrl = u ...

  7. BZOJ 1016 JSOI 2008 最小生成树计数 Kruskal+搜索

    题目大意:给出一些边,求出一共能形成多少个最小生成树. 思路:最小生成树有非常多定理啊,我也不是非常明确.这里仅仅简单讲讲做法.关于定各种定理请看这里:http://blog.csdn.net/wyf ...

  8. ohasd failed to start: Inappropriate ioctl for device

    今天同事在安装GI的时候出现故障.让我帮忙看一下. 以下记录例如以下: 问题现象: 在安装gi的时候运行root.sh报例如以下错误: Finished running generic part of ...

  9. oc block 遍历数组及字典

    原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count ...

  10. json2.js

    /* http://www.JSON.org/json2.js 2010-03-20 Public Domain. NO WARRANTY EXPRESSED OR IMPLIED. USE AT Y ...