diff --git a/exam/ex01/dijkstra.py b/exam/ex01/dijkstra.py new file mode 100644 index 0000000..65e1e82 --- /dev/null +++ b/exam/ex01/dijkstra.py @@ -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) + + + +