Naive alogrithm for Subgraph Isomorphism.
1. 如何判定子图同构。
有个Gα和Gβ, Gα有pa个点,qa条边,Gβ有pb个点,qb条边。A是Gα的邻接矩阵,相应的B是Gβ的邻接矩阵。那么如何判断同构呢。设A是子图,B是原图。那么有一个A的点到B的点的映射。这个映射的模式叫做M。M是pa行,pb列的。M有一个性质就是每行只有一个1,每列至多一个1。这个就是一个A中的点到B中的点的一个映射。我们定义一个C = [cij] = M(MB)T。如果在图A中i和j有边能推导出图C中i和j有边。那为什么是对的呢。因为M是映射,MB就是把B中被映射的点按照顺序抽出来在和B点对应。 M中第i行j列为1的意义是A的第i个点对应,B的第j个点。MB中第i行j列为1的意义是现在A的第i个点对应到的点到B的第j个点有一条边。把这个矩阵转置在乘以M。C就是B中和A对应的点和在B中的边全部抽出来组成的图。
那么如果aij = 1能推导出cij = 1。A就是B的一个子图的同构。
1 #include <iostream> 2 #include <stdio.h> 3 4 class Matrix{ 5 private:int **cont; 6 int a, b; 7 public: 8 Matrix(){ 9 cont = 0; 10 a = b = 0; 11 } 12 Matrix(int a, int b){ 13 this->a = a; 14 this->b = b; 15 cont = new int*[a]; 16 for (int i = 0; i < a; i++){ 17 cont[i] = new int[b]; 18 for (int j = 0; j < b; j++){ 19 cont[i][j] = 0; 20 } 21 } 22 } 23 Matrix(void *x, int a, int b){ 24 int *y = (int*