예제 #1
0
    def dfs_search(self, s, current_position, next_):
        if current_position >= len(self.edge_seq):
            s.pop()
            return

        while len(s) > 0:
            x = s.pop()
            i = 0
            while i < len(self.graph.get_edge_nexts()[x]):
                #~ pdb.set_trace()
                y = self.graph.get_edge_nexts()[x][i]
                if self.f[x][y] or self.f[y][x]:
                    i += 1
                    continue
                #  如果节点没有被使用过
                if self.g2s[y] < 0:
                    e = Edge(self.g2s[x], next_,
                             self.graph.get_node_labels()[x],
                             self.graph.get_edge_labels()[x][i],
                             self.graph.get_node_labels()[y])

                    compare_result = e.compare_with(
                        self.edge_seq[current_position])

                    if compare_result == e.edge_smaller:
                        self.is_min = False
                        return
                    elif compare_result == e.edge_larger:
                        i += 1
                        continue
                    # 相等则继续比较
                    self.g2s[y] = next_
                    self.f[x][y] = True
                    self.f[y][x] = True
                    s.append(y)
                    self.dfs_search(s, current_position + 1, next_ + 1)
                    if not self.is_min:
                        return
                    else:
                        self.f[x][y] = False
                        self.f[y][x] = False
                        self.g2s[y] = -1
                        i += 1
                # 如果节点有被使用过
                else:
                    e = Edge(self.g2s[x], self.g2s[y],
                             self.graph.get_node_labels()[x],
                             self.get_edge_labels()[x][i],
                             self.get_node_labels()[y])
                    compare_result = e.compare_with(
                        self.edge_seq[current_position])

                    if compare_result == e.edge_smaller:
                        self.is_min = False
                        return
                    elif compare_result == e.edge_larger:
                        i += 1
                        continue
                    g2s[y] = self.next_
                    self.f[x][y] = True
                    self.f[y][x] = True
                    s.push(y)
                    self.dfs_search(s, current_position + 1, next_)
                    if not self.is_min:
                        return
                    self.f[x][y] = True
                    self.f[y][x] = True
                    i += 1