Advertisement
Guest User

Untitled

a guest
Dec 16th, 2022
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. class Graph:
  2. def __init__(self):
  3. self.graph={}
  4. self.rates={}
  5. self.nodes=set()
  6.  
  7. def add_edge(self, a, b):
  8. if a not in self.nodes:
  9. self.nodes.add(a)
  10. if b not in self.nodes:
  11. self.nodes.add(b)
  12. if a not in self.graph:
  13. self.graph[a]=[]
  14. self.graph[a].append(b)
  15.  
  16. def add_rate(self, a, rate):
  17. self.rates[a]=rate
  18.  
  19. def floyd_warshall(self):
  20. self.distances={}
  21. for node1 in self.nodes:
  22. for node2 in self.nodes:
  23. self.distances[(node1, node2)]=10**5
  24. for node in self.nodes:
  25. self.distances[(node, node)]=0
  26. for node2 in self.graph[node]:
  27. self.distances[(node, node2)]=1
  28.  
  29. for node1 in self.nodes:
  30. for node2 in self.nodes:
  31. for node3 in self.nodes:
  32. self.distances[(node2, node3)]=min(self.distances[(node2, node3)], self.distances[(node2, node1)]+self.distances[(node1, node3)])
  33.  
  34.  
  35. def find_all_paths(self, maxtime):
  36. self.allpaths=set()
  37. visited=set()
  38. visited.add("AA")
  39. for node in self.nodes:
  40. if self.rates[node]==0:
  41. visited.add(node)
  42. def helper(path, timeleft, visited):
  43. visited=visited.copy()
  44. self.allpaths.add(" ".join(path))
  45. for node in self.nodes:
  46. if node in visited:
  47. continue
  48. dist=self.distances[(path[-1], node)]
  49. if dist<timeleft:
  50. visited.add(node)
  51. helper(path+[node], timeleft-dist-1, visited)
  52. visited.remove(node)
  53. helper(["AA"], maxtime, visited)
  54. return self.allpaths
  55.  
  56. def released_pressure(self, path, time):
  57. released=0
  58. path=path.split()
  59. for i in range(1, len(path)):
  60. time=time-self.distances[(path[i-1], path[i])]-1
  61. released+=time*self.rates[path[i]]
  62. return released
  63.  
  64. ##inputfile="test16.txt"
  65. inputfile="input16.txt"
  66. graph=Graph()
  67. with open(inputfile) as myfile:
  68. for line in myfile:
  69. parts=line.strip().replace(", ",",").split()
  70. valve, flow, neighbs = parts[1], int(parts[4].split("=")[1][:-1]), parts[-1].split(",")
  71. graph.add_rate(valve, flow)
  72. for neighb in neighbs:
  73. graph.add_edge(valve, neighb)
  74. graph.floyd_warshall()
  75. paths1=graph.find_all_paths(30)
  76. maxreleased=0
  77. for path in paths1:
  78. maxreleased=max(maxreleased, graph.released_pressure(path, 30))
  79.  
  80. maxreleased=0
  81. paths2=graph.find_all_paths(26)
  82. pathpressures={}
  83. for path in paths2:
  84. path_sorted=" ".join(sorted(path.split()))
  85. if path_sorted not in pathpressures:
  86. pathpressures[path_sorted]=0
  87. pathpressures[path_sorted]=max(pathpressures[path_sorted], graph.released_pressure(path, 26))
  88.  
  89. for path1 in pathpressures:
  90. nodes1=path1.split()
  91. for path2 in pathpressures:
  92. nodes2=path2.split()
  93. allnodes=set(nodes1+nodes2)
  94. if len(allnodes)+1<len(nodes1)+len(nodes2):
  95. continue
  96. maxreleased=max(maxreleased, pathpressures[path1]+pathpressures[path2])
  97. print(maxreleased)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement