50 lines
980 B
Python
50 lines
980 B
Python
from collections import deque
|
|
|
|
START = 'you'
|
|
END = 'out'
|
|
|
|
def dfs_sort(graph):
|
|
visited = set()
|
|
order = deque()
|
|
|
|
def dfs_helper(node):
|
|
visited.add(node)
|
|
for v in graph.get(node, []):
|
|
if v not in visited:
|
|
dfs_helper(v)
|
|
|
|
order.appendleft(node)
|
|
|
|
dfs_helper(START)
|
|
return order
|
|
|
|
def dp(graph, order):
|
|
dp = {node: 0 for node in graph}
|
|
dp[START] = 1
|
|
|
|
for node in order:
|
|
for neighbor in graph[node]:
|
|
dp[neighbor] += dp[node]
|
|
|
|
return dp[END]
|
|
|
|
with open('input.txt', 'r') as file:
|
|
lines = file.readlines()
|
|
|
|
graph = {}
|
|
for line in lines:
|
|
line = line.strip()
|
|
nodes = line.split()
|
|
node = nodes[0].rstrip(':')
|
|
edges = nodes[1:]
|
|
graph[node] = edges
|
|
|
|
graph[END] = []
|
|
|
|
topological_order = dfs_sort(graph)
|
|
|
|
pruned_graph = {node: graph[node] for node in topological_order if node in graph}
|
|
|
|
result = dp(pruned_graph, topological_order)
|
|
|
|
print(result) |