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)