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 }