回溯法——最大团问题(Maximum Clique Problem, MCP)
概述:
最大团问题(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中所含顶点数最多的团。
算法分析:
算法描述:
#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)的更多相关文章
- 【最大团】【HDU1530】【Maximum Clique】
先上最大团定义: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题,在国际上已有广泛的研究,而国内对MCP问题的研究则还处于起步 ...
- UVA - 524 Prime Ring Problem(dfs回溯法)
UVA - 524 Prime Ring Problem Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & % ...
- HDU 1016 Prime Ring Problem (回溯法)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- UVA - 524 Prime Ring Problem(素数环)(回溯法)
题意:输入n,把1~n组成个环,相邻两个数之和为素数. 分析:回溯法. #pragma comment(linker, "/STACK:102400000, 102400000") ...
- 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 ...
- Maximum Clique
Maximum Clique Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- B. Clique Problem(贪心)
题目链接: B. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- [codeforces 528]B. Clique Problem
[codeforces 528]B. Clique Problem 试题描述 The clique problem is one of the most well-known NP-complete ...
- CodeForces - 527D Clique Problem (图,贪心)
Description The clique problem is one of the most well-known NP-complete problems. Under some simpli ...
随机推荐
- 神秘值分解(Singular Value Decomposition)
- 线性变化的几何表现 首先看下简单的矩阵,这是一个对角矩阵 M=(3001) 我们先用这个对角矩阵乘以一个点来看看它的几何变化. (3001)∗(xy)=(3xy) 在几何上就相当于把原来的向量x轴 ...
- How to get the url of a page in OpenERP?
How to get the url of a page in OpenERP? User is using OpenERP. I have a button on one web page. The ...
- 去除前后空格,Oracle和SQLSERVER都适用。ltrim(rtrim(’ ‘))
Oracle自带去除方法:trim(). 但是sql语法中没有直接去除两头空格的函数,但有ltrim()去除左空格rtrim()去除右空格. 合起来用就是sql的trim()函数,即select lt ...
- ios 调试过程捕获异常Stack 信息
在AppDelegate,定义方法 void catchExceptionHandler(NSException *exception) { NSLog(@"CRASH: %@", ...
- ios 自动布局水平跟垂直居中
[view addConstraint:[NSLayoutConstraint constraintWithItem:segment attribute:NSLayoutAttributeCenter ...
- js ctrl+v实现图片粘贴
<script> // demo 程序将粘贴事件绑定到 document 上 document.addEventListener("paste", function ( ...
- android自定义View&&简单布局&&回调方法
一.内容描述 根据“慕课网”上的教程,实现一个自定义的View,且该View中使用自定义的属性,同时为该自定义的View定义点击事件的回调方法. 二.定义自定义的属性 在res/valus/ 文件夹下 ...
- Java多线程——不可变对象
不可变对象条件 对象需要满足一下三个条件才是不可变对象: 1.对象创建以后其状态就不能修改 2.对象所有域都是final类型 3.对象是正确创建的(对象在创建期间,this引用没有溢出) 简而言之就是 ...
- 关于http和rpc的区别(segmentfault上的回答)
问题最近用了谷歌的grpc,所以对rpc和http有一点疑惑,感觉这两个东西功能上是一样的,rpc某个服务监听某一个方法,客户端调用这个方法,返回相应的数据,和http监听某个方法的路由 返回相应的数 ...
- Angularjs学习笔记7_directive1
1.基础知识 directive()接受两个参数 · name:字符串,指令的名字 · factory_function:函数,指令的行为 应用启动时,以name作为该应用的标识注册factory_f ...