最大团问题介绍:给定无向图G=<V,E>,G是一个完全子图(任何两点之间都有边)就称为G的一个团,问题是找一个最大团(顶点 数最多的团)(先实现只从中找一个最大团,题目也可能要求找所有的最大团)
/**************************最大团问题********************/ #include <iostream> using namespace std; const int N = 10; int n;//原图顶点数 int A[N][N] = { 0 };//表示图的顶点是否连接的关系矩阵 int tempmax; int OptimalMax; int x[N] = { 0 }; int Optimal[N] = { 0 }; //bool OK = true; int Bound(int k) { x[k] = 0; int Cn = 0;//表示符合条件的点集里点的数目 for (int i = 1; i <k; ++i) { if (x[i] == 1) ++Cn; } return Cn+n-k; } void Traceback(int k) //k是新加入的顶点(要考虑第i层) { if (k> n) // 到达叶结点 { for (int j = 1; j <= n; j++) { Optimal[j] = x[j]; cout << x[j] << " "; } cout << endl; OptimalMax = tempmax; } else { bool OK = true; //这个OK不能是全局变量 for (int j = 1; j < k; j++) if (x[j] && A[k][j] == 0) { // i与j不相连 OK =false; break; } if (OK)// 进入左子树 { x[k] = 1; tempmax++; Traceback(k+ 1);//此句之后便是回溯 x[k] = 0; //既然回溯,考虑第k个点不加入会更好不 tempmax--; } if (tempmax + n - k >= OptimalMax)// 进入右子树 //tempmax + n - k是代价函数,OptimalMax是界,右子树要是有比OptimalMax大的希望就走下试试 { x[k] = 0; Traceback(k + 1); } } } int main() { cout << "这是回溯+分支限定解决最大团问题的算法实现:" << endl; cout << "/*********************************/" << endl; cout << "请输入原图的顶点数n: "; cin >> n; cout << "请输入A[i][j]"; cout << endl; for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) { cin >> A[i][j]; } Traceback(1); cout << "最大顶点集的顶点个数是:"; cout << OptimalMax << endl; cout << "与之对应的解向量是:"; for (int i = 1; i <= n; i++) { cout << Optimal[i] << " "; } return 0; }
参考:https://blog.csdn.net/liufeng_king/article/details/8781554
本文为博主原创文章,未经博主允许不得转载