参考资料:
Bron-Kerbosch算法视频介绍
极大团算法
不确定图上求极大团算法
不确定图上的枚举算法研究
我们这里是把不确定图当确定图(也就是普通的图),来处理的,并没由考虑边上的概率。之所以是用的不确定图,主要是因为我最近研究的是不确定图,把不确定图的数据结构换成确定图的,也是一样的。
不确定图:
不确定图就是指边或者顶点信息中带有不确定性的图,这种不确定性通常是通过给边赋予权值来量化。用一个三元组 G=(V, E, β)表示一个不确定图,其中 β 表示边的权值,0< β <1,代表边存在的概率。
如图所示不确定图中,每一条边都拥有权值,用来表示该边在实际应用中存在的概率,所以它是一个不确定图。
1,图的存储结构用什么好?
确定为邻接vector存储结构,因为vector作为STL中的类,封装了很多函数,用起来很方便。
2,运行时遇到错误:vector subscript out of range?
应该是有vector没有分配足够的空间,但是却用了它的下标。
在我的上一篇文章里面用的思想主要是:设定关键点 pivot vertex u,只对关键点u自身和u的非邻居结点进行查找。伪代码如下:
1 | Bron-Kerbosch Algorithm |
在这个方法里的思想是:按照图顶点编号升序地往顶点集合 C 中添加顶点。例如,如果当前的顶点集合 C={1,3,4},则当前顶点集合 C 中的最大顶点编号为 4,那么在扩展当前顶点集合 C 的过程中不需要考虑加入顶点 2,因为顶点集合{1,2,3,4}会在处理顶点 1 时按照顶点编号顺序 2,3,4 依次添加而得到。当然添加进入的顶点,必须是在C中所有顶点的公共邻居结点集合中,也就是集合P(some集合)中。
下边是头文件,大部分和上次一样,只有BasicFunctions.h会有所不同:
1 | Vertex_Value.h |
1 | node.h |
1 | UDG.h |
1 | ReadFile.h |
BasicFunctions.h里面的函数会和以前有所不同:
1 | BasicFunctions.h |
下面是cpp文件
1 | Vertex_Value.cpp |
1 | ReadFile.cpp |
1 | #include<algorithm> |
下面是主函数:
1 | #include <tchar.h> |
test2.txt如下:
9表示结点数,28表示边数(这里的1 2和2 1算不同的边)
第一位数字是头结点,第二位数字是边结点,第三个数字是边上的概率
1 | 9 28 |
实验结果: