子圖同構算法系列(1)


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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM