mirror of
https://github.com/iritmaximus/tira.git
synced 2026-10-12 19:13:47 +03:00
did week 13
This commit is contained in:
@@ -0,0 +1,66 @@
|
|||||||
|
class Connections:
|
||||||
|
def __init__(self, n_count):
|
||||||
|
self.nodes = [x for x in range(1, n_count + 1)]
|
||||||
|
self.graph = {node: [] for node in self.nodes}
|
||||||
|
self.reverse = {node: [] for node in self.nodes}
|
||||||
|
|
||||||
|
def add_link(self, a, b):
|
||||||
|
self.graph[a].append(b)
|
||||||
|
self.reverse[b].append(a)
|
||||||
|
|
||||||
|
def visit(self, node, phase):
|
||||||
|
if node in self.visited:
|
||||||
|
return
|
||||||
|
self.visited.add(node)
|
||||||
|
|
||||||
|
if phase == 1:
|
||||||
|
graph = self.graph
|
||||||
|
if phase == 2:
|
||||||
|
graph = self.reverse
|
||||||
|
|
||||||
|
for next_node in graph[node]:
|
||||||
|
self.visit(next_node, phase)
|
||||||
|
|
||||||
|
if phase == 1:
|
||||||
|
self.order.append(node)
|
||||||
|
|
||||||
|
def check_network(self):
|
||||||
|
self.target = set(self.nodes)
|
||||||
|
self.visited = set()
|
||||||
|
self.order = []
|
||||||
|
self.last_order = []
|
||||||
|
|
||||||
|
for node in self.nodes:
|
||||||
|
self.visit(node, 1)
|
||||||
|
|
||||||
|
|
||||||
|
self.order.reverse()
|
||||||
|
self.visited.clear()
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
for node in self.order:
|
||||||
|
if node not in self.visited:
|
||||||
|
count += 1
|
||||||
|
self.visit(node, 2)
|
||||||
|
|
||||||
|
return count == 1
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
connections = Connections(5)
|
||||||
|
|
||||||
|
connections.add_link(1, 2)
|
||||||
|
connections.add_link(2, 3)
|
||||||
|
connections.add_link(1, 3)
|
||||||
|
connections.add_link(4, 5)
|
||||||
|
|
||||||
|
print(connections.check_network()) # False
|
||||||
|
|
||||||
|
connections.add_link(3, 5)
|
||||||
|
connections.add_link(1, 4)
|
||||||
|
|
||||||
|
print(connections.check_network()) # False
|
||||||
|
|
||||||
|
connections.add_link(5, 1)
|
||||||
|
|
||||||
|
print(connections.check_network()) # True
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
class CoursePlan:
|
||||||
|
def __init__(self):
|
||||||
|
self.nodes = []
|
||||||
|
self.graph = {node: [] for node in self.nodes}
|
||||||
|
|
||||||
|
def add_course(self, course):
|
||||||
|
self.nodes.append(course)
|
||||||
|
self.graph = {node: [] for node in self.nodes} # Recalc things
|
||||||
|
|
||||||
|
def add_requisite(self, course1, course2):
|
||||||
|
self.graph[course1].append(course2)
|
||||||
|
|
||||||
|
def find_order(self):
|
||||||
|
self.state = {}
|
||||||
|
for node in self.nodes:
|
||||||
|
self.state[node] = 0
|
||||||
|
|
||||||
|
self.order = []
|
||||||
|
self.cycle = False
|
||||||
|
|
||||||
|
for node in self.nodes:
|
||||||
|
if self.state[node] == 0:
|
||||||
|
self.visit(node)
|
||||||
|
|
||||||
|
if self.cycle:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
self.order.reverse()
|
||||||
|
return self.order
|
||||||
|
|
||||||
|
def visit(self, node):
|
||||||
|
if self.state[node] == 1:
|
||||||
|
self.cycle = True
|
||||||
|
return
|
||||||
|
if self.state[node] == 2:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.state[node] = 1
|
||||||
|
for next_node in self.graph[node]:
|
||||||
|
self.visit(next_node)
|
||||||
|
|
||||||
|
self.state[node] = 2
|
||||||
|
self.order.append(node)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
courses = CoursePlan()
|
||||||
|
|
||||||
|
courses.add_course("Ohpe")
|
||||||
|
courses.add_course("Ohja")
|
||||||
|
courses.add_course("Tira")
|
||||||
|
courses.add_course("Jym")
|
||||||
|
|
||||||
|
courses.add_requisite("Ohpe", "Ohja")
|
||||||
|
courses.add_requisite("Ohja", "Tira")
|
||||||
|
courses.add_requisite("Jym", "Tira")
|
||||||
|
|
||||||
|
print(courses.find_order()) # esim. [Ohpe, Jym, Ohja, Tira]
|
||||||
|
|
||||||
|
courses.add_requisite("Tira", "Tira")
|
||||||
|
|
||||||
|
print(courses.find_order()) # None
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
class CountPaths:
|
||||||
|
def __init__(self, nodes):
|
||||||
|
self.nodes = nodes
|
||||||
|
self.graph = {node: [] for node in self.nodes}
|
||||||
|
|
||||||
|
def add_edge(self, a, b):
|
||||||
|
self.graph[a].append(b)
|
||||||
|
|
||||||
|
def count_from(self, node):
|
||||||
|
if node in self.result:
|
||||||
|
return self.result[node]
|
||||||
|
|
||||||
|
path_count = 0
|
||||||
|
for next_node in self.graph[node]:
|
||||||
|
path_count += self.count_from(next_node)
|
||||||
|
|
||||||
|
self.result[node] = path_count
|
||||||
|
return path_count
|
||||||
|
|
||||||
|
def count_paths(self, x, y):
|
||||||
|
self.result = {y: 1}
|
||||||
|
return self.count_from(x)
|
||||||
|
|
||||||
|
|
||||||
|
def create_edges():
|
||||||
|
result = []
|
||||||
|
for i in range(2, 100):
|
||||||
|
result.extend([(1, i), (i, 100)])
|
||||||
|
|
||||||
|
result.append((97,99))
|
||||||
|
result.append((98,99))
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
edges = create_edges()
|
||||||
|
print(edges)
|
||||||
|
|
||||||
|
counter = CountPaths(range(1, 100 + 1))
|
||||||
|
for edge in edges:
|
||||||
|
counter.add_edge(edge[0], edge[1])
|
||||||
|
print(counter.count_paths(1, 100)) # 100
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
class Graph:
|
||||||
|
def __init__(self, nodes):
|
||||||
|
self.nodes = nodes
|
||||||
|
self.graph = {node: [] for node in self.nodes}
|
||||||
|
|
||||||
|
def add_edge(self, a, b):
|
||||||
|
self.graph[a].append(b)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
g = Graph([i for i in range(1, 1001)])
|
||||||
|
|
||||||
|
for i in range(1, 1001):
|
||||||
|
for j in range(1, i):
|
||||||
|
g.add_edge(j, i)
|
||||||
|
|
||||||
|
sum = 0
|
||||||
|
for x in g.graph.keys():
|
||||||
|
sum += len(g.graph[x])
|
||||||
|
print(x, g.graph[x])
|
||||||
|
|
||||||
|
print(sum)
|
||||||
Reference in New Issue
Block a user