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

你可能感兴趣的:(子图同构算法系列(1))