Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ford Fulkerson(最大流,最小割)使用DFS,邻接列表在Python中实现_Python_Algorithm_Data Structures_Graph Algorithm - Fatal编程技术网

Ford Fulkerson(最大流,最小割)使用DFS,邻接列表在Python中实现

Ford Fulkerson(最大流,最小割)使用DFS,邻接列表在Python中实现,python,algorithm,data-structures,graph-algorithm,Python,Algorithm,Data Structures,Graph Algorithm,我正在用Python编写代码,我是一名初学者。我被福特富尔克森DFS邻接列表代码卡住了。不知何故,我无法正确分配流量变量。如果有人能在这里帮助我,那就太好了。问题似乎与流量变量有关,在该变量中,信息无法通过不同的函数正确传输 #.............................................................................. Code in Python is as follows: Answer to the problem1 is

我正在用Python编写代码,我是一名初学者。我被福特富尔克森DFS邻接列表代码卡住了。不知何故,我无法正确分配流量变量。如果有人能在这里帮助我,那就太好了。问题似乎与流量变量有关,在该变量中,信息无法通过不同的函数正确传输

#..............................................................................
Code in Python is as follows:  Answer to the problem1 is 11. Answer to problem2 is 19. 
#...................................................................

'''code'''

class Edge:
    def __init__(self, v1,v2, capacity,flow):
        self.from1 = v1
        self.to1 = v2
        self.capacity = capacity
        self.residual=[]
        self.flow = flow
        
        
    def isResidual(self):
        return self.capacity == 0
    
    def remaining_capacity(self):
        
        kk = self.capacity - self.flow
        print("Line 22, inside remaining capacity, kk,self.flow",kk,self.flow )
        return self.capacity - self.flow
        
    def augment(self,bottleneck):
        print("Line 24, INside Augment, self.flow,self.residual.flow,, self.from1, self.to1, self.capacity ", self.flow,self.residual.flow, self.from1, self.to1, self.capacity )
        self.flow =+ bottleneck
        self.residual.flow =- bottleneck
        #self.residual.capacity =- bottleneck
        #self.capacity =- bottleneck
        #self.residual.capacity =- bottleneck
        
        
class Graph:
    def __init__(self, numvertices):
        self.m = numvertices
        self.graph = []
        self.initialize_empty_flow_graph()
        
    def initialize_empty_flow_graph(self):
        
        for i in range(self.m):
            self.graph.append([])
            
    def add_edge(self, v1,v2,capacity,flow):
        e1 = Edge(v1,v2, capacity,flow)
        e2 = Edge(v2,v1,0,flow)
        
        e1.residual = e2
        e2.residual = e1
                self.graph[v1].append(e1)
        self.graph[v2].append(e2)
        
class ford_fulkerson:
    def __init__(self, Graph, numvertices):
        #self.n = numvertices
        self.n = numvertices
        self.s = self.n - self.n # source index
        self.t = self.n - 1  # sink index
        self.visitedToken = 0
        #self.visited = list(range(0,self.n))
        self.visited = list(range(100,n+100))
        #self.visited = list(range(-self.n, 0))
        self.minCut = [False]*self.n
        self.maxFlow = 0
        
    def solve(self,Graph):
        
        while True:
                
            print("-------Line 293---------, in solve")
            f = self.dfs(Graph, self.s, flow = float("inf"))
            print("Line 79, bottleneck value in solve", f)
            self.visitedToken = self.visitedToken+1
            self.maxFlow = self.maxFlow+f
            
            print("Line 83: self.maxFlow and F",self.maxFlow, f )
            if f == 0:
                break
            
    def dfs(self,Graph, node, flow):
        print("-----------a-------------------")
        #print()
        
        if (node == self.t):
            print("Line 92,flow", flow)
            return flow
        
        self.visited[node] = self.visitedToken
        edges = Graph.graph[node]
        for edge in edges:
            print("Line 97:Inside for loop,edge.from1,edge.to1,edge.capacity",edge.from1,edge.to1,edge.capacity)
            if (edge.remaining_capacity()>0 and self.visited[edge.to1] != self.visitedToken):
                print("Line 99:Inside if condition, for loop")
                bottleneck = self.dfs(Graph,edge.to1, min(flow, edge.remaining_capacity()))
                #flow = edge.flow
                print("Line 102, bottleneck",bottleneck)
                if (bottleneck > 0):
                    
                    edge.augment(bottleneck)
                    
                    return bottleneck
        return 0
    
            
#.......................
# Problem 1: # Answer is 11.      

n = 4
g = Graph(n) # nodes+1source node +1 sink node

s = n-n # source node is n-2; 
t = n-1 # sink node is n-1
flow = 0
g.add_edge(s, 1, 7,flow)
g.add_edge(s, 2, 12,flow)
g.add_edge(1, 2, 9,flow)
g.add_edge(1, t, 10,flow);
g.add_edge(2, t, 4,flow);

ford = ford_fulkerson(g,n)
ford.solve(g)

#.......................
# Problem 1: # Answer is 19

n = 6
g = adjacency_set_graph(n, directed = False) # nodes+1source node +1 sink node
s = n-n # source node is n-2; 
t = n-1 # sink node is n-1
flow = 0
g.add_edge(s, 1, 10,flow)
g.add_edge(s, 2, 10,flow)

g.add_edge(1, 2, 2,flow)
g.add_edge(1, 3, 4,flow)
g.add_edge(1, 4, 8,flow)
g.add_edge(2, 4, 9,flow)
g.add_edge(4, 3, 6,flow)

g.add_edge(3, t, 10,flow);
g.add_edge(4, t, 10,flow);
ford = ford_fulkerson(g)
print(ford.n,ford.s,ford.t)
ford.solve(g)
    

=+
“操作符”看起来可疑——它们被解析为
self.flow=(+瓶颈)
。此操作工作正常。问题是,一旦dfs遍历所有节点并为它们计算流,那么特定的边应该记住没有发生的情况。另外,我不确定在dfs中是否正在使用self.residential.flow。