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*) x; 25 this->a = a; 26 this->b = b; 27 cont = new int*[a]; 28 for (int i = 0; i < a; i++){ 29 cont[i] = new int[b]; 30 for (int j = 0; j < b; j++){ 31 cont[i][j] = y[i*a + j]; 32 } 33 } 34 } 35 Matrix(const Matrix& x){ 36 if (x.isNULL()){ 37 cont = 0; 38 a = b = 0; 39 } 40 else{ 41 a = x.a; b = x.b; 42 cont = new int*[a]; 43 for (int i = 0; i < a; i++){ 44 cont[i] = new int[b]; 45 for (int j = 0; j < b; j++){ 46 cont[i][j] = x.cont[i][j]; 47 } 48 } 49 } 50 } 51 ~Matrix(){ 52 for (int i = 0; i < b; i++){ 53 delete[] cont[i]; 54 } 55 delete cont; 56 } 57 Matrix Muiltply(Matrix y){ 58 if (isNULL() || y.isNULL() || b != y.a){ 59 return Matrix(); 60 } 61 Matrix z(a, y.b); 62 for (int i = 0; i < a; i++){ 63 for (int j = 0; j < y.b; j++){ 64 for (int k = 0; k < b; k++){ 65 z.cont[i][j] += cont[i][k] * y.cont[k][j]; 66 } 67 } 68 } 69 return z; 70 } 71 Matrix boolMuiltply(Matrix y){ 72 if (isNULL() || y.isNULL() || b != y.a){ 73 return Matrix(); 74 } 75 Matrix z(a, y.b); 76 for (int i = 0; i < a; i++){ 77 for (int j = 0; j < y.b; j++){ 78 for (int k = 0; k < b; k++){ 79 z.cont[i][j] += cont[i][k] * y.cont[k][j]; 80 } 81 if(z.cont[i][j] > 0){ 82 z.cont[i][j] = 1; 83 } 84 } 85 } 86 return z; 87 } 88 bool isNULL() const{ 89 if (cont == 0){ 90 return true; 91 } 92 else{ 93 return false; 94 } 95 } 96 bool isequal(Matrix& y){ 97 if(a == y.a && b == y.b){ 98 for (int i = 0; i < a; i++){ 99 for (int j = 0; j < a; j++){ 100 if(cont[i][j] != y.cont[i][j]){ 101 return false; 102 } 103 } 104 } 105 return true; 106 } else{ 107 return false; 108 } 109 } 110 Matrix Trans(){ 111 Matrix x(b,a); 112 for (int i = 0; i < a; i++){ 113 for (int j = 0; j < b; j++){ 114 x.cont[j][i] = cont[i][j]; 115 } 116 } 117 return x; 118 } 119 bool iscontent(const Matrix &A)const{ 120 if(a == A.a && b == A.b){ 121 for (int i = 1; i <= a; i++){ 122 for (int j = 1; j <= b; j++){ 123 if(A.cont[i][j] == 1 && cont[i][j] == 0){ 124 return 0; 125 } 126 } 127 } 128 return 1; 129 } 130 return 0; 131 } 132 void print(){ 133 if (isNULL()){ 134 printf("NULL\n"); 135 } 136 for (int i = 0; i < a; i++){ 137 for (int j = 0; j < b; j++){ 138 std::cout << cont[i][j] << " "; 139 } 140 std::cout << std::endl; 141 } 142 } 143 }; 144 145 int main(){ 146 typedef Matrix Map; 147 typedef Matrix Transfer; 148 Map A,B;Transfer M; 149 Map x = M.boolMuiltply(M.boolMuiltply(B).Trans()); 150 x.iscontent(A); 151 }