子图同构算法系列(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

 

posted on 2015-02-06 23:24  Skullpirate  阅读(3486)  评论(0编辑  收藏  举报

导航