def Solve(self):
        print(" The intit BFS:")
        findBFS = self.BFS()
        if (findBFS != True):
            print("No have BFS!")
            return False
        print("Find the LP maximum solution: ")
        print("First Step: ")
        print_table(self.tbl)
        print('Base = ', self.base)
        simplex = Simplex(self.tbl, self.base)
        if (simplex.Solve() != True):
            print("Can't solve phase 2")
            return False
        self.tbl = simplex.tbl
        self.base = simplex.base

        print("LP optimum solution!")
        print_table(self.tbl)
        print('Base = ', self.base)

        return True
    def BFS(self):
        solver: bool
        # giai bai toan voi dau vao chua them bien
        tbl = np.empty((self.M + 1, self.M + self.N + 1), dtype=Fraction)
        b = np.empty(self.M,
                     dtype='int')  # b[i] =k if k-th is the base variable

        # xac dinh he so cac bien thuc
        for i in range(self.M):
            for j in range(self.N):
                tbl[i][j] = self.tbl[i][j]

        for i in range(self.M):
            for j in range(self.N, self.N + self.M):
                tbl[i][j] = zero
            tbl[i][self.N + i] = one
            tbl[i][self.N + self.M] = self.tbl[i][self.N]
            b[i] = self.N + i

        for j in range(self.N):
            tbl[self.M][j] = zero

        for j in range(self.N, self.N + self.M):
            tbl[self.M][j] = ngone
        tbl[self.M][self.M + self.N] = zero

        print("BFS with SLack vars")
        print_table(tbl)
        print('Base =  ', b)

        sim = Simplex(tbl, b)
        if (sim.Solve() != True):
            solver = False
            return solver

        b = sim.base
        tbl = sim.tbl

        print("Anwser after Simplex 1-th")
        print_table(tbl)
        print('Base', b)

        if (tbl[-1][-1] != zero):
            print("Not have BFS!")
            solver = False
            return solver

        for i in range(self.M):
            for j in range(self.N):
                self.tbl[i][j] = tbl[i][j]
            self.tbl[i][self.N] = tbl[i][self.N + self.M]

        flag = np.full(self.N, False, dtype=bool)
        for i in range(self.M):
            if (b[i] < self.N):
                self.base[i] = b[i]
                flag[b[i]] = True
        for i in range(self.M):
            if (b[i] >= self.N):
                for j in range(self.N):
                    if (flag[j] == False):
                        self.base[i] = j
                        flag[j] = True
                        break
        solver = True
        return solver