最大团问题
2015-10-17 12:48
260 查看
#include "stdio.h" #include "stdlib.h" #define MAX 10 int a[6][6]; //图的邻接矩阵 int x[MAX]; //当前解向量空间 int cn = 0; //当前团中的顶点个数 int bestn = 0; //最大团中的顶点个数 int bestx[MAX]; //最优解向量空间 int n; //图中的顶点个数 //搜索到第i个顶点 void backtrack(int i) { if(i>n) { int j; for(j=1; j<=n; j++) bestx[j] = x[j]; bestn = cn; return; } int j; int ok = 1; for(j=1; j<i; j++) //检查当前顶点是否与之前被加入团中的顶点连接 if(x[j] && !a[i][j]) //如果当前顶点与已加入的顶点不相邻,则不属于最大团 { ok = 0; break; } if(ok) //如果连接,则搜索左子树 { x[i] = 1; //该顶点加入团 cn++; //当前团中的顶点数增加 backtrack(i+1); //检查下一个顶点 x[i] = 0; //回到上一层 cn--; } //如果当前团中的顶点数+图中剩余顶点数>=最优值,则可能产生最优值,搜素右子树 if(cn + n - i >= bestn) { x[i] = 0; //该顶点不加人 backtrack(i+1); //检查下一个顶点 } } void maxClique(int a1[][6], int n1) { n = n1; int i, j; for(i=1; i<=n; i++) for(j=1; j<=n; j++) a[i][j] = a1[i][j]; backtrack(1); } int main(){ int n1 = 5; int i, j; int a1[6][6] = { {0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 1, 1}, {0, 1, 0, 1, 0, 1}, {0, 0, 1, 0, 0, 1}, {0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 1, 0} }; maxClique(a1, n1); printf("图的邻接矩阵为:\n"); for(i=1; i<=n; i++) { for(j=1; j<=n; j++) printf("%d ", a[i][j]); printf("\n"); } printf("图的最大团解向量为:\n"); for(i=1; i<=n; i++) printf("%d ", bestx[i]); printf("\n"); printf("最大团中的顶点个数为:%d\n", bestn); return 0; }
相关文章推荐
- 由耳入心
- 静态方法为什么不能用this和super
- Android图片缓存框架Android-Universal-Image-Loader的使用详解
- Code Forces 585 A. Gennady the Dentist(模拟)
- 快速排序算法-容器存储vector
- 文章标题
- C# Winform欢迎窗体实现()
- poj1700-Crossing River(贪心算法)
- 关于克隆的虚拟机不能上网的问题
- java 连接 zookeeper
- 我在京东做产品经理的这九十九天
- ObjectAnimator属性动画应用demo
- Android:FullImageView 自定义等比缩放的铺满控件显示的ImageView
- 大数据量高效导入数据库(以excel导入sqlserver为例)
- AndroidStudio 开发报错汇总
- iOS应用的生命周期
- 数据库防火墙如何防范SQL注入行为
- Python: 去掉字符串中的非数字(或非字母)字符
- <LeetCode><Easy> 20 Valid Parenthese
- 数据结构与算法(选择性插入排序)