added dijkstra algorithm
This commit is contained in:
parent
dabddc352f
commit
08e05fa136
52
exam/ex01/dijkstra.py
Normal file
52
exam/ex01/dijkstra.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
|
||||
def prepare_dijkstra(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute('''INSERT OR IGNORE INTO dijkstra_helper(name)
|
||||
SELECT destination FROM links
|
||||
''')
|
||||
|
||||
cursor.execute("UPDATE dijkstra_helper SET value=1e1000")
|
||||
connection.commit()
|
||||
|
||||
def dijkstra_one(title, value, connection):
|
||||
cursor = connection.cursor()
|
||||
if(isinstance(title, tuple)):
|
||||
# Idk why this happens.
|
||||
title = title[0]
|
||||
cursor.execute('''SELECT name
|
||||
FROM dijkstra_helper
|
||||
LEFT JOIN links ON links.destination=dijkstra_helper.name
|
||||
WHERE links.source=:title
|
||||
AND dijkstra_helper.value>:value''', {"title": title, "value": value + 1})
|
||||
# This is the list of nodes that have to be updated
|
||||
result = cursor.fetchall()
|
||||
|
||||
cursor.execute('''UPDATE dijkstra_helper
|
||||
SET value=:value
|
||||
WHERE name IN (
|
||||
SELECT destination
|
||||
FROM links
|
||||
WHERE source=:title)
|
||||
AND dijkstra_helper.value>:value''', {"value": value + 1, "title": title})
|
||||
connection.commit()
|
||||
return result
|
||||
|
||||
def recursive_dijkstra(titles, value, connection):
|
||||
if(not titles):
|
||||
return
|
||||
|
||||
for title in titles:
|
||||
todos = dijkstra_one(title, value, connection)
|
||||
recursive_dijkstra(todos, value + 1, connection)
|
||||
|
||||
|
||||
def dijkstra(title, connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("UPDATE dijkstra_helper SET value=0 WHERE name=?", (title,))
|
||||
|
||||
todos = dijkstra_one(title, 1, connection)
|
||||
recursive_dijkstra(todos, 2, connection)
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user