Поиск путей между точками

Есть ряд точек на плоскости. Есть несколько неориентированных, незамкнутых графов, проходящих по этим точкам.

Пользователь вводит две точки из всего ряда точек.
Надо указать какие графы содержат обе точки, и какой путь самый короткий.

Исходить из предположения, что из любой точки всегда можно попасть в любую другую точку, т.е. всегда существует хотя бы один путь, приводящий из одной точки в другую.

Этапы разработки программы смотрите ниже в подшивке.

Внешний вид программы

# Из файла points.txt в словарь загружаются точки и их координаты.
# Из файла graphs.txt загружаются названия графов и их узлы.
# Узлами могут быть только точки, перечисленные в файле points.txt.
# Точки отображаются на холсте.
# Программа отображает все возможные пути между двумя точками,
#   заданными пользователем, и определяет кратчайший путь.
 
# Python 3.x.x 
# Скрипт распространяется на условиях лицензии GNU GPL
# Автор: Светлана Шапошникова (plustilino)
 
####################################################################
 
# Загрузка данных из файлов
points = {}
for line in open('points.txt'):
    line = line.split('\n')
    line = line[0]
    line = line.split(' ')
    line[1] = int(line[1])
    line[2] = int(line[2])
    points[line[0]] = line[1:]
 
graphs = {}
for line in open('graphs.txt'):
    line = line.split('\n')
    line = line[0]
    line = line.split(' ')
    graphs[line[0]] = line[1:]
#############################
 
# Функции
def func_onlypoints(): # очистка холста, прорисовка точек
    canv.delete('all')
    for i in points: 
        coords = points[i]
        x = coords[0]
        y = coords[1]
        canv.create_rectangle(x,y,x+5,y+5,fill="black")
        canv.create_text(x-5,y-5,text=i)
 
def func_line(coords1,coords2,indent=0,col=-1): # ЧЕРТИТ ОДИН ОТРЕЗОК
    x1 = coords1[0]
    y1 = coords1[1]
    x2 = coords2[0]
    y2 = coords2[1]
    canv.create_line(x1+indent,y1+indent,x2+indent,y2+indent,\
                    fill=colors[col])
 
def check_graph(i,first_p,second_p,col,indent,note_x,note_y):
    # ОБРАБОТКА ОДНОГО ГРАФА
    qty = 0 # Количество точек между заданными пользователем точками
    graph = graphs[i]
    if first_p in graph:
        if second_p in graph:
            f = 0 # Где находится первая точка
            while first_p != graph[f]: # определяем
                f += 1
            s = 0 # Где находится вторая точка
            while second_p != graph[s]:
                s += 1
            if f < s: # Если первая точка встречается раньше, чем вторая:
                qty = s - f # количество точек от первой до второй
                while f < s: # прорисовка отрезков
                    xy1 = points[graph[f]]
                    xy2 = points[graph[f+1]]
                    func_line(xy1,xy2,indent,col)
                    f += 1 # переход к следующей точке
            else: # Если вторая точка встречается раньше, чем первая
                qty = f - s
                while s < f:
                    xy1 = points[graph[f]]
                    xy2 = points[graph[f-1]]
                    func_line(xy1,xy2,indent,col)
                    f -= 1
            canv.create_line(note_x,note_y,note_x+30,note_y,\
                             fill=colors[col],width=3)
            canv.create_text(note_x+33,note_y-10,text=i,fill=colors[col])
            note_y += 20
    col += 1
    indent += 2
    return qty,col,indent,note_x,note_y
 
def func_paths(event): # ПРОРИСОВКА ВСЕХ ВОЗМОЖНЫХ ПУТЕЙ МЕЖДУ ДВУМЯ ТОЧКАМИ   
    func_onlypoints()
    col = 0 # счетчик для цвета
    indent = 0 # отступ линии
    note_x = 450 # позиция пояснений 
    note_y = 30
    first_p = ent1.get()
    second_p = ent2.get()
    qty_points = 100
    min_graph = []
    for i in graphs:
        q,col,indent,note_x,note_y = check_graph(i,first_p,\
                                               second_p,col,indent,\
                                               note_x,note_y)
        if q != 0 and q <= qty_points:
            min_graph.append(i)
            if q < qty_points:
                qty_points = q
                min_graph = []
                min_graph.append(i)       
    min_str = ''
    for i in min_graph:
        min_str = min_str + ' ' + i
    lab_minpath.configure(text='The shortest path: '+ min_str)
 
def func_onegraphs(event): # ОДИН ПОЛНЫЙ ПУТЬ
    func_onlypoints()
    select = list_graphs.get(ACTIVE)
    points_path = graphs[select] # список точек пути
    length = len(points_path) # их количество
    n = 0 # индекс текущей точки
    while length > 1:
        point = points_path[n] # название точки
        xy1 = points[point] # ее координаты
        point = points_path[n+1] # название следующей точки
        xy2 = points[point]
        func_line(xy1,xy2)
        n += 1
        length -= 1
 
def func_allgraphs(event): # ПРОРИСОВКА ВСЕХ ГРАФОВ
    func_onlypoints()
    col = 0 # счетчик для цвета
    indent = 0 # отступ, чтобы линии не перекрывались
    note_x = 450
    note_y = 30
    for i in graphs: # извлекли путь
        points_path = graphs[i] # список точек пути
        length = len(points_path) # их количество
        n = 0 # индекс текущей точки
        while length > 1:
            point = points_path[n] # название точки
            xy1 = points[point] # ее координаты
            point = points_path[n+1] # название следующей точки
            xy2 = points[point]
            func_line(xy1,xy2,indent,col)
            length -= 1
            n += 1
        indent += 2
        canv.create_line(note_x,note_y,note_x+30,note_y,\
                             fill=colors[col],width=3)
        canv.create_text(note_x+33,note_y-10,text=i,fill=colors[col])
        note_y += 20
        col += 1
#############################
 
colors = ["green","red","blue","darkgreen"]
 
# Графический интерфейс
from tkinter import *
window = Tk()
canv = Canvas(window,width=500,height=500,bg="white")
 
lab_ent1 = Label(window,text="First point:")
ent1 = Entry(window,width=2)
lab_ent2 = Label(window,text="Second point:")
ent2 = Entry(window,width=2)
but_select = Button(window,text="Paths")
lab_minpath = Label(window,text="XXXXXX")
 
lab_list = Label(window,text="Graph:")
list_graphs = Listbox(window,selectmode=SINGLE,height=6,width=10)
but_graph = Button(window,text="Graph")
but_all = Button(window,text="All graphs")
 
func_onlypoints()
for i in graphs:
    list_graphs.insert(END,i)
but_select.bind("<Button-1>",func_paths)
but_graph.bind("<Button-1>",func_onegraphs)
but_all.bind("<Button-1>",func_allgraphs)
 
canv.grid(row=0,column=0,rowspan=40)
lab_ent1.grid(row=0,column=1,sticky=E,padx=10)
ent1.grid(row=0,column=2,sticky=W,padx=10)
lab_ent2.grid(row=1,column=1,sticky=E,padx=10)
ent2.grid(row=1,column=2,sticky=W,padx=10)
but_select.grid(row=2,column=1,columnspan=2,sticky=E+W,padx=10)
lab_minpath.grid(row=3,column=1,columnspan=2,sticky=N)
lab_list.grid(row=15,column=1,sticky=E+N,padx=10)
list_graphs.grid(row=15,column=2,sticky=W,padx=10)
but_graph.grid(row=16,column=2,sticky=W+E,padx=10)
but_all.grid(row=39,column=1,columnspan=2,sticky=E+W,padx=10)
window.mainloop()
#############################