scientific-programming-exer.../exam/ex01/dijkstra.py

61 lines
1.5 KiB
Python

from collections import deque
from cfg import config
def prepare_dijkstra(connection):
cursor = connection.cursor()
cursor.execute('''INSERT OR IGNORE INTO dijkstra_helper(name)
SELECT destination FROM links
''')
if(config["use_sqlite"]):
cursor.execute("UPDATE dijkstra_helper SET value=1e1000")
else:
cursor.execute("UPDATE dijkstra_helper SET value=2147483647")
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
todos = deque()
for title in titles:
todos.extend(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)