text 给定无向图G =(V,E),其中V是非空集合,称为顶点集; E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“()”表示。如果U∈V,且对任意两个
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text 给定无向图G =(V,E),其中V是非空集合,称为顶点集; E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“()”表示。如果U∈V,且对任意两个相关的知识,希望对你有一定的参考价值。
//最大团问题 回溯法求解
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
const int N = 5;//图G的顶点数
ifstream fin("5d7.txt");
class Clique
{
friend int MaxClique(int **,int[],int);
private:
void Backtrack(int i);
int **a, //图G的邻接矩阵
n, //图G的顶点数
*x, //当前解
*bestx, //当前最优解
cn, //当前顶点数
bestn; //当前最大顶点数
};
int MaxClique(int **a, int v[], int n);
int main()
{
int v[N+1];
int **a = new int *[N+1];
for(int i=1;i<=N;i++)
{
a[i] = new int[N+1];
}
cout<<"图G的邻接矩阵为:"<<endl;
for(int i=1; i<=N; i++)
{
for(int j=1; j<=N; j++)
{
fin>>a[i][j];
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<"图G的最大团解向量为:"<<endl;
cout<<"图G的最大团顶点个数为:"<<MaxClique(a,v,N)<<endl;
for(int i=1;i<=N;i++)
{
delete[] a[i];
}
delete []a;
return 0;
}
// 计算最大团
void Clique::Backtrack(int i)
{
if (i > n) // 到达叶结点
{
for (int j = 1; j <= n; j++)
{
bestx[j] = x[j];
cout<<x[j]<<" ";
}
cout<<endl;
bestn = cn;
return;
}
// 检查顶点 i 与当前团的连接
int OK = 1;
for (int j = 1; j < i; j++)
if (x[j] && a[i][j] == 0)
{
// 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);
}
}
int MaxClique(int **a, int v[], int n)
{
Clique Y;
//初始化Y
Y.x = new int[n+1];
Y.a = a;
Y.n = n;
Y.cn = 0;
Y.bestn = 0;
Y.bestx = v;
Y.Backtrack(1);
delete[] Y.x;
return Y.bestn;
}
0 1 0 1 1
1 0 1 0 1
0 1 0 0 1
1 0 0 0 1
1 1 1 1 0
以上是关于text 给定无向图G =(V,E),其中V是非空集合,称为顶点集; E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“()”表示。如果U∈V,且对任意两个的主要内容,如果未能解决你的问题,请参考以下文章
Kruskal算法求最小生成树
第六周学习小结
Kruskal算法
859. Kruskal算法求最小生成树(模板)
图的基本概念,图的存储--邻接矩阵、邻接表、十字链表、邻接多重表
数据结构第六章小结————图