Lekcja – Wykrywanie cykli w grafie

```graph = [
[1, 4],
[2,3,4],
[3],
[],
[4,5],
[]
]

def has_cycle_to_node(graph, node, visited, path):

visited[node] = True
path.append(node)

for neighbour in graph[node]:
if not visited[neighbour]:
if has_cycle_to_node(graph, neighbour, visited, path):
return True
if neighbour in path:
cycle = path.copy()
while cycle[0] != neighbour:
del cycle[0]
cycle.append(neighbour)
print(cycle)
return True

del path[-1]
return False

def has_cycle(graph):
visited = [False] * len(graph)
path = []

for node in range(len(graph)):
if not visited[node]:
if has_cycle_to_node(graph, node, visited, path):
return True

return False

if has_cycle(graph):
print("Graph has a cycle")
else:
print("Graph has no cycle")
```

Lab

```names = ['Dad', 'Mum', 'Grandma', 'Grandpa','Doughter', 'Son']
history = [
[0,1,0,0,0,0],
[0,0,1,0,0,0],
[0,0,0,0,1,0],
[0,0,0,0,0,0],
[0,0,0,0,0,0],
[0,0,0,0,0,0]
]

def has_cycle_to_node(graph, node, visited, path):

visited[node] = True
path.append(node)

neighbours = []
for n in range(len(graph[node])):
if graph[node][n] == 1:
neighbours.append(n)

for neighbour in neighbours:
if visited[neighbour] == False:
if has_cycle_to_node(graph, neighbour, visited, path):
return True
if neighbour in path:
cycle = path.copy()
while cycle[0] != neighbour:
del cycle[0]
cycle.append(neighbour)
print([names[i] for i in cycle])
return True

del path[-1]
return False

source=4
for candidate in range(len(names)):
org_value = history[source][candidate]
history[source][candidate] = 1
visited = [False for x in range(len(names))]
path = []
has_cycle = has_cycle_to_node(history, source, visited, path)
history[source][candidate] = org_value

if has_cycle:
print(f'Giving the gift to {names[candidate]} would make a loop')
else:
print(f'OK to give the gift to {names[candidate]}')```