edmonds-karp

mail@pastecode.io avatar
unknown
plain_text
2 years ago
3.8 kB
2
Indexable
Never
import numpy as np
import collections

def formatter():
    input = open("C:\\Users\\kalls\\OneDrive\\Dokument\\EDAF05-labs-public-master\\6railwayplanning\\data\\sample\\1.in")
    numbers = input.readline().split()
    N = int(numbers[0]) #Number of nodes (cities)
    M = int(numbers[1]) #Number of edges (connections)
    C = int(numbers[2]) #Number of flow (students/soldiers)
    P = int(numbers[3]) #Number of routes
    dict1 = {}
    dict2 = {}  # We create dictionaries here
    edgelist = []
    for i in range(0, N):
        dict1.update({i: []})
        dict2.update({i: []})  # And fill them with keys, one for each node
    for j in range(0,M):
        edge = input.readline().split()
        dict1[int(edge[0])].append({int(edge[1]):int(edge[2])})
        dict2[int(edge[1])].append({int(edge[0]):int(edge[2])})
        edgelist.append((edge[0],edge[1]))
    removelist = []
    for k in range (0,P):
        edgenr = input.readline()
        removelist.append(edgelist[edgenr])
    for i in dict1:  # Here we combine the dictionaries into one
        if dict2[i] == []:
            continue
        elif dict1[i] == []:
            dict1[i] = dict2[i]
        else:
            # We add all edges in dict2 to the list in dict1
            for j in range(0, len(dict2[i])):
                dict1[i].append(dict2[i][j])
        

    return N,M,C,P,dict1,removelist

class Graph:
    """This class represents a directed graph using adjacency matrix representation."""

    def __init__(self, graph):
        self.graph = graph  # residual graph
        self.row = len(graph)

    def bfs(self, s, t, parent):
        """Returns true if there is a path from source 's' to sink 't' in
        residual graph. Also fills parent[] to store the path."""

        # Mark all the vertices as not visited
        visited = [False] * self.row

        # Create a queue for BFS
        queue = collections.deque()

        # Mark the source node as visited and enqueue it
        queue.append(s)
        visited[s] = True

        # Standard BFS loop
        while queue:
            u = queue.popleft()

            # Get all adjacent vertices of the dequeued vertex u
            # If an adjacent has not been visited, then mark it
            # visited and enqueue it
            for ind, val in enumerate(self.graph[u]):
                if (visited[ind] == False) and (val > 0):
                    queue.append(ind)
                    visited[ind] = True
                    parent[ind] = u

        # If we reached sink in BFS starting from source, then return
        # true, else false
        return visited[t]

    # Returns the maximum flow from s to t in the given graph
    def edmonds_karp(self, source, sink):

        # This array is filled by BFS and to store path
        parent = [-1] * self.row

        max_flow = 0  # There is no flow initially

        # Augment the flow while there is path from source to sink
        while self.bfs(source, sink, parent):

            # Find minimum residual capacity of the edges along the
            # path filled by BFS. Or we can say find the maximum flow
            # through the path found.
            path_flow = float("Inf")
            s = sink
            while s != source:
                path_flow = min(path_flow, self.graph[parent[s]][s])
                s = parent[s]

            # Add path flow to overall flow
            max_flow += path_flow

            # update residual capacities of the edges and reverse edges
            # along the path
            v = sink
            while v != source:
                u = parent[v]
                self.graph[u][v] -= path_flow
                self.graph[v][u] += path_flow
                v = parent[v]

        return max_flow

if __name__ == '__main__':
    N,M,C,P,dict,removelist = formatter()