Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.82 KB | None | 0 0
  1. INFINITY = 999999999999999
  2.  
  3.  
  4. def deep_copy(graph):
  5.     return [[graph[i][j] for j in range(len(graph[i]))] for i in range(len(graph))]
  6.  
  7.  
  8. def dfs(graph, start, dest, path):
  9.     num_vertices = len(graph)
  10.     visited = [False for _ in range(num_vertices)]
  11.     queue = [start]
  12.     visited[start] = True
  13.     path[start] = None
  14.     while len(queue) > 0:
  15.         node = queue.pop()
  16.         for i in range(num_vertices):
  17.             if not visited[i] and graph[node][i] > 0:
  18.                 queue.append(i)
  19.                 path[i] = node
  20.                 visited[i] = True
  21.     return visited[dest]
  22.  
  23.  
  24. def find_path_flow(dest, path, residual_graph):
  25.     res = INFINITY
  26.     cur = dest
  27.     while path[cur] is not None:
  28.         parent = path[cur]
  29.         graph_c = residual_graph[parent][cur]
  30.         res = min(res, graph_c)
  31.         cur = parent
  32.     return res
  33.  
  34.  
  35. def update_capacities(dest, path_flow, path, residual_graph):
  36.     cur = dest
  37.     while path[cur] is not None:
  38.         parent = path[cur]
  39.         residual_graph[parent][cur] -= path_flow
  40.         residual_graph[cur][parent] += path_flow
  41.         cur = parent
  42.  
  43.  
  44. def max_flow(graph, source, dest):
  45.     res = 0
  46.     path = [None for _ in range(len(graph))]
  47.     while dfs(graph, source, dest, path):
  48.         path_flow = find_path_flow(dest, path, graph)
  49.         update_capacities(dest, path_flow, path, graph)
  50.         path = [None for _ in range(len(graph))]
  51.         res += path_flow
  52.     return res
  53.  
  54.  
  55. def main():
  56.     num_policeman = int(input())
  57.     nums = read_int_list()
  58.     num_vertex = nums[0]
  59.     num_edges = nums[1]
  60.     museum = nums[2] - 1
  61.     refuge = nums[3] - 1
  62.     vertex_weight = read_int_list()
  63.     vertex_weight[museum] = INFINITY
  64.     vertex_weight[refuge] = INFINITY
  65.  
  66.     graph = read_graph(num_edges, num_vertex, vertex_weight)
  67.  
  68.     if museum == refuge or graph[refuge][museum + num_vertex] > 0 \
  69.             or graph[museum + num_vertex][refuge]:
  70.         print("NO")
  71.         return
  72.  
  73.     flow = max_flow(graph, refuge, museum + num_vertex)
  74.     if flow <= num_policeman:
  75.         print("YES")
  76.     else:
  77.         print("NO")
  78.  
  79.  
  80. def read_graph(num_edges, num_vertex, vertex_weight):
  81.     graph = [[0 for _ in range(2 * num_vertex)] for _ in range(2 * num_vertex)]
  82.     for _ in range(num_edges):
  83.         edge = read_int_list()
  84.         one, two = edge[0] - 1, edge[1] - 1
  85.         graph[one][one + num_vertex] = vertex_weight[one]
  86.         graph[one + num_vertex][one] = vertex_weight[one]
  87.         graph[two][two + num_vertex] = vertex_weight[two]
  88.         graph[two + num_vertex][two] = vertex_weight[two]
  89.         graph[one + num_vertex][two] = INFINITY
  90.         graph[two][one + num_vertex] = INFINITY
  91.  
  92.     return graph
  93.  
  94.  
  95. def read_int_list():
  96.     return list(map(lambda x: int(x), input().split(" ")))
  97.  
  98.  
  99. if __name__ == '__main__':
  100.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement