简要说明

通过使用python实现图的可视化,以及广度优先的最短距离,深度优先的最短路径,dijkstra的最短路径

dijkstra最短路径

深度优先最短路径


深度优先忘记标路径的边及方向

广度优先最短路径


这个广度优先可能有点BUG,有时候是对的有时候有错,因为刚检查完,忙着复习期末考试,没时间调了

操作说明

1.需要安装graphviz,这是可视化的库

2.需要安装opencv,因为要读写图片

3.当开始运行程序时,首先要点击“初始化画图”然后再点击“画图”才显示出图片

这是初始化图后的显示

4.当你每次要操作其他功能的时候,都要先“清空”然后“初始化画图”,及画图,这样一轮循环。比如你先填如初始节点“a”,目的节点“v”,点击“dijkstra最短路径”(dijkstra是我最后加的文本)

然后当你要再要选择广度优先或者深度优先填入节点时,首先要点击“清空”,然后再“初始化画图”,再“画图”,就是重新初始化,然后就可以进行其他的操作,每次都要循环这个操作

点击“清空”

跟原来一样,没变化

然后“初始化画图”,以及画图

这样就重新初始化成功了。可以进行别的操作

可以进行节点的添加,和边的添加,但没有删除功能

5.添加节点“yyy”,然后点击“添加节点”,然后“画图”

图中出现“yyy”的节点,这是可视化graphviz自动分配的位置,下一步添加边和权值,输入要连接的节点名称和权值,然后点击“添加边”,以及“画图”

如果想删除或恢复原来的状态就进行重新初始化操作,跟上面提到的一样

代码

#好像没什么注释,有时间再补吧

import cv2
import copy
import time
import graphviz as gv
import tkinter
from tkinter import *
tk=tkinter.Tk()g = gv.Graph('1',format='png',edge_attr ={},node_attr={"fixedsize":"shape"},engine='neato')g1=gv.Graph("2",format='pdf',engine='neato')
tk.geometry("1500x800")e=tkinter.Entry(tk)
e.place(x=0,y=0)
edge=tkinter.Entry(tk)
edge1=tkinter.Entry(tk)
edge2=tkinter.Entry(tk)
breath=tkinter.Entry(tk,width=10)
breath1=tkinter.Entry(tk,width=10)
breath2=tkinter.Entry(tk,width=10)
depth=tkinter.Entry(tk,width=10)
depth1=tkinter.Entry(tk,width=10)
depth2=tkinter.Entry(tk,width=10)
djstla=tkinter.Entry(tk,width=10)
djstla1=tkinter.Entry(tk,width=10)
edge.place(x=0,y=60)
edge1.place(x=150,y=60)
edge2.place(x=300,y=60)
breath2.place(x=100,y=290)
breath.place(x=0,y=190)
breath1.place(x=100,y=190)depth.place(x=0,y=340)
depth1.place(x=100,y=340)
depth2.place(x=100,y=240)
djstla.place(x=200,y=90)
djstla1.place(x=300,y=90)
menu0=Menu(tk)#参数是父级控件
list1=['a','b','c','d','e','f','g','h','l','m','n','o','p','q','r','s','t','u','v','w','x','a1','b1','c1','d1','e1','f1','g1','a2','b2']
length=30
adrect=[[0,25,-1,60,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[25,0,50,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,50,0,-1,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[60,30,-1,0,30,10,50,-1,-1,-1,-1,-1,-1,-1,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,12,30,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,10,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,50,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[20,25,-1,60,-1,-1,-1,0,25,-1,60,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,25,0,50,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,50,0,-1,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,60,30,-1,0,12,10,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,45,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,25,-1,60,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,25,0,50,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,-1,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,30,-1,0,12,10,50,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,25,-1,60,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,25,0,50,30,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,0,-1,12,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,60,30,-1,0,12,10,50,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,0,-1,-1,-1,10],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,0,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,0,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,2,-1],]#初始化邻近矩阵
list2={}j=0
for i in list1:list2[i]=jj=j+1
print(list2)global minshu
minshu=9999999
def lab():print("1")
for x in ['文件','编辑','视图']:menu0.add_command(label=x,command=lab)#添加3个一级菜单
tk['menu'] = menu0
def addpoint():a=e.get()if(a not in list1):g.node(name=a)list1.append(a)list3 = []for i in range(len(list1)-1):adrect[i].append(-1)for j in range(len(list1)-1):list3.append(-1)list3.append(0)adrect.append(list3)list2.update({a:len(list1)-1})print(list1)print(adrect)print(list2)button=tkinter.Button(tk,text="添加节点",command=addpoint)
button.place(x=200,y=0)
def addedge():a=edge.get()b=edge1.get()c=edge2.get()if( adrect[list2[a]][list2[b]]==-1):adrect[list2[a]][list2[b]]=int(c)adrect[list2[b]][list2[a]]=int(c)g.edge(a,b,c)print(adrect)
lab1=tkinter.Label(tk,text="边的权值")
lab1.place(x=350,y=30)
lab2=tkinter.Label(tk,text="第一个点")
lab2.place(x=200,y=30)
lab3=tkinter.Label(tk,text="第二个点")
lab3.place(x=50,y=30)
button2=tkinter.Button(tk,text="  添加边  ",command=addedge)
button2.place(x=500,y=50)def drawpicture():# g.view()g.render("1.gv",view=False)img = cv2.imread("1.gv.png")#h = cv2.resize(img, (600, 750))cv2.imwrite("img1.png", img)render=tkinter.PhotoImage(file="./img1.png")la=tkinter.Label(tk,image=render,width=800,height=800)la.place(x=700,y=0)tk.mainloop()
button1=tkinter.Button(tk,text="  画图  ",command=drawpicture)
button1.place(x=620,y=50)
def firstdrawpicture():#g.attr('graph',{"size": "7,7", "ratio ": "expand"})g.attr(size='7,7')#g.attr('graph',mindist="0.2")g.attr('node', fontsize='10',style='filled')g.attr('node',width='0.4',height='0.4')g.attr('node',fixedsize='shape', fontsize = '16')#g.attr('edge',len="5", fontsize = '10')g.node(name='a')g.node(name='b')g.node(name='a2')g.node(name='b2')g.node(name='c')g.node(name='d')g.node(name='e')g.node(name='f')g.node(name='g')g.node(name='a1')g.node(name='b1')g.node(name='c1')g.node(name='d1')g.node(name='e1')g.node(name='f1')g.node(name='g1')g.node(name='h')g.node(name='l')g.node(name='m')g.node(name='n')g.node(name='o')g.node(name='p')g.node(name='q')g.node(name='r')g.node(name='s')g.node(name='t')g.node(name='u')g.node(name='v')g.node(name='w')g.node(name='x')g.edge('a','b',label='25')g.edge('b','c',label='50')g.edge('b', 'd',label='30')g.edge('a', 'd',label='60')g.edge('d', 'g',label='50')g.edge('d', 'e',label='30')g.edge('d', 'f',label='10')g.edge('c', 'e', label='12')g.edge('a1', 'b1', label='25')g.edge('b1', 'c1', label='50')g.edge('b1', 'd1', label='30')g.edge('a1', 'd1', label='60')g.edge('d1', 'g1', label='50')g.edge('d1', 'e1', label='12')g.edge('d1', 'f1', label='10')g.edge('c1', 'e1', label='12')g.edge('h', 'l', label='25')g.edge('l', 'm', label='50')g.edge('l', 'n', label='30')g.edge('h', 'n', label='60')g.edge('n', 'q', label='50')g.edge('n', 'o', label='12')g.edge('n', 'p', label='10')g.edge('m', 'o', label='12')g.edge('a', 'h', label='20')g.edge('r', 's', label='25')g.edge('s', 't', label='50')g.edge('s', 'u', label='30')g.edge('r', 'u', label='60')g.edge('u', 'x', label='50')g.edge('u', 'v', label='12')g.edge('u', 'w', label='10')g.edge('t', 'v', label='12')g.edge('d','r',label='45')g.edge('a2', 'b2', label='2')g.edge('o', 'a1', label='20')g.edge('b2', 'e1', label='10')g.edge('a2', 'v', label='5')g.render("1.gv", view=False)button3=tkinter.Button(tk,text="初始化画图",command=firstdrawpicture)
button3.place(x=620,y=0)
#queue=[]
#res=[]
#visited=[False]*(len(list1))
def bfs(queue,res,visited,dis,b,res1):global  minpglobal ggh,path11ggh={}ggh[queue[0]]=0minp=9999999path11={}#gr=queuewhile len(queue) > 0:key= queue.pop(0)res1.append(key)#print("ffff",queue)#gr.append(key)if(key==b):print(dis)breakprint(key)i=list2[key]for j in range(len(list1)):if adrect[i][j]> 0 and visited[j] == False:res.append(list1[j])ggh[list1[j]]=adrect[i][j]visited[j] = Truefor jj in range(len(list1)):if (adrect[list2[list1[j]]][jj] > 0 and visited[jj] == True):ggh[list1[j]] = adrect[list2[list1[j]]][jj] + ggh[list1[jj]]path11[list1[j]]=list1[jj]for ii in range(len(list1)):if(adrect[list2[list1[j]]][ii]>0 and visited[ii]==True):if(adrect[list2[list1[j]]][ii]+ggh[list1[ii]]<ggh[list1[j]]):ggh[list1[j]]=adrect[list2[list1[j]]][ii]+ggh[list1[ii]]path11[list1[j]] = list1[ii]dis=dis+adrect[i][j]queue.append(list1[j])print(queue)def breath_serach():queue = []res = []res1=[]visited = [False] * (len(list1))start = time.time()a=breath.get()b=breath1.get()if len(list1) <= 0:return reselse:queue.append(a)  # 节点名称visited[list2[a]] = True#节点所在的位置号res.append(a)bfs(queue,res,visited,0,b,res1)print(res)print(res1)print(ggh)print(path11)rr=[]def router(b):if(b!=a):for ji in path11:if(b==ji):rr.append(b)router(path11[b])router(b)rr.append(a)rr.reverse()print(rr)end=time.time()zuiduanluji=ggh[b]print(zuiduanluji)label10 = tkinter.Label(tk, text="最短路径:"+str(zuiduanluji))label10.place(x=0, y=220)label11 = tkinter.Label(tk, text="运行时间" + str(end-start))label11.place(x=100, y=220)'''str1=''for jk in res:j=0str1=str(str1)+jkj=j+1#   if(j>=len(res)-2):breakelse:str1 = str1 + '->'print(str1)label1=tkinter.Label(tk, text=str1)label1.place(x=0,y=270)''''''list4 = {}j = 0for ii in res:list4[j] = iij = j + 1'''for i in range(len(rr) - 1):g.attr('edge', dir='forward')g.edge(rr[i], rr[i + 1], color='red')g.attr('edge', dir='forward')g.node(rr[i], shape='doublecircle', style='filled', color='red')g.node(rr[len(rr) - 1], shape='doublecircle', style='filled', color='red')g.render("2.gv", view=False)#img = cv2.imread("2.gv.png")#h = cv2.resize(img, (300, 565))# cv2.imwrite("img.png", h)#render = tkinter.PhotoImage(file="./img.png")render = tkinter.PhotoImage(file="./2.gv.png")la = tkinter.Label(tk, image=render, width=800, height=800)la.place(x=700, y=0)tk.mainloop()button4=tkinter.Button(tk,text="广度优先搜素最短路径",command=breath_serach)
button4.place(x=200,y=190)
def bfs2(queue,res,visited):while len(queue) > 0:key= queue.pop(0)i=list2[key]for j in range(len(list1)):if adrect[i][j]> 0 and visited[j] == False:res.append(list1[j])visited[j] = Truequeue.append(list1[j])
def breath_serach1():queue = []res = []visited = [False] * (len(list1))a=breath2.get()if len(list1) <= 0:return reselse:queue.append(a)  # 节点名称visited[list2[a]] = True#节点所在的位置号res.append(a)bfs2(queue,res,visited)print(res)str1=''for jk in res:j=0str1=str(str1)+jkj=j+1if(j>=len(res)-2):breakelse:str1 = str1 + '->'print(str1)label1=tkinter.Label(tk, text=str1)label1.place(x=0,y=320)list4 = {}j = 0for ii in res:list4[j] = iij = j + 1for i in range(len(res) - 1):g.attr('edge', dir='forward')g.edge(list4[i], list4[i + 1], color='red')g.attr('edge', dir='forward')g.node(list4[0], shape='doublecircle', style='filled', color='red')g.render("2.gv", view=False)# img = cv2.imread("2.gv.png")# h = cv2.resize(img, (300, 565))# cv2.imwrite("img.png", h)# render = tkinter.PhotoImage(file="./img.png")render = tkinter.PhotoImage(file="./2.gv.png")la = tkinter.Label(tk, image=render, width=800, height=800)la.place(x=700, y=0)tk.mainloop()button41=tkinter.Button(tk,text="广度优先搜索",command=breath_serach1)
button41.place(x=200,y=290)
global book,path,min,minn,hhh,pp,dis,aaa,yyy,pk
minn=[]
hhh=[]
aaa=[]
min1 = 9999999
def dfss(cur,dis,aim,book,path,pk):global min1,pp,yyyif(aim==cur):#for i in range(list2['a'],len(list1)):#if( path[i]):#print(path)#print(dis)if min1>dis:min1=disprint(path)print(pk)pp=copy.copy(path)#print(pp)#print(path)minn.append(min1)jp=sorted(minn)yyy=jp[0]while len(minn)>0:minn.pop()#print(minn)global flagtt = 0for h  in range(list2['a'],len(list1)):if(adrect[list2[cur]][h]>0  and book[h]==0):book[h]=1path[h]=list1[h]#print(tt)pk[tt]=list1[h]'''for hk in range(len(pk)):if(pk[hk]==list1[h]):flag=hkprint(flag)'''#print(pk)#print(book)#print(path)dfss(list1[h],dis+adrect[list2[cur]][h],aim,book,path,pk)book[h]=0path[h]=0pk[tt]=0tt=tt+1#print(book)#print(path)def dfs1():global book,path,pp,pkpk= [0] * len(list1)book = [0] * len(list1)path = [0] * len(list1)a=depth.get()book[list2[a]]=1pk[list2[a]]=1b=depth1.get()path[list2[a]]=astart=time.time()dfss(a,0,b,book,path,pk)#aaa=sorted(minn)#print(minn)print(yyy)hp=yyyend=time.time()#while len(aaa)>0:#   aaa.pop()#for ii in minn:#    aaa.append(ii)#print(sorted(aaa))#hp=aaa[0]str1="最短路径"#print(minn[aaa[0]])label1 = tkinter.Label(tk, text=str1+str(hp)+"  ")label1.place(x=0, y=370)label12 = tkinter.Label(tk, text="运行时间:" + str(end-start))label12.place(x=100, y=370)#print(pp)while len(hhh)>0:hhh.pop()#print(hhh)for jj in pp:if(jj!=0):hhh.append(jj)print(hhh)ght = {}ghtt=[]jkp=0for ty in hhh:ght[ty] = jkpghtt.append(ty)jkp = jkp + 1print(ght)print(ghtt)qw={}qw1={}gr={}for ih in hhh:qw1[ih]=0qw[a]=0global ghqghq=copy.deepcopy(hhh)def gy(a):visted=[False]*len(hhh)while(len(ghq)>0):key = ghq.pop(0)visted[ght[key]]=Truefor ij in range(len(hhh)):if(adrect[list2[key]][list2[hhh[ij]]]>0 and visted[ij]==False):if(qw1[hhh[ij]]>0):qw1[hhh[ij]]=qw1[hhh[ij]]else:qw1[hhh[ij]]=adrect[list2[key]][list2[hhh[ij]]]if(qw1[hhh[ij]]>qw1[key]+adrect[list2[key]][list2[hhh[ij]]] and visted[ij]==False):qw1[hhh[ij]]=qw1[key]+adrect[list2[key]][list2[hhh[ij]]]gr[hhh[ij]]=keyif(adrect[list2[key]][list2[hhh[ij]]]>0 and visted[ij]==False):qw1[hhh[ij]]=qw1[key]+adrect[list2[key]][list2[hhh[ij]]]gr[hhh[ij]] = keygy(a)print(qw1)print(gr)routlist=[]if(b in gr.keys()):def rout(b):if(b!=a):for key in gr:if(b==key):print(gr[key])routlist.append(gr[key])rout(gr[b])rout(b)routlist.insert(0,b)routlist.reverse()print(routlist)else:def rout(a):if(b!=a):for key in gr:if(a==key):print(gr[key])routlist.append(gr[key])rout(gr[a])rout(a)routlist.insert(0,a)print(routlist)# print(pk)#for i in hhh:# for j in hhh:#  if(adrect[list2[i]][list2[j]]>0):#    g.edge(list1[list2[i]], list1[list2[j]], color='red')for i in range(len(hhh) - 1):#g.attr('edge', dir='forward')# g.edge(routlist[i], routlist[i + 1], color='red')#g.attr('edge', dir='forward')g.node(hhh[i], shape='doublecircle',style='filled',color='red')g.node(hhh[len(hhh)-1],shape='doublecircle',style='filled',color='red')g.render("2.gv", view=False)render = tkinter.PhotoImage(file="./2.gv.png")la = tkinter.Label(tk, image=render, width=800, height=800)la.place(x=700, y=0)tk.mainloop()def dfs(res,visited,a,juli,temp):res.append(a)juli[a]=tempvisited[list2[a]] = Truefor j in range(len(list1)):if adrect[list2[a]][j] > 0 and visited[j] == False:temp1=temp+adrect[list2[a]][j]dfs(res,visited,list1[j],juli,temp1)
def depth_serach():res=[]juli={}temp=0visited=[False]*len(list1)a=depth2.get()dfs(res,visited,a,juli,temp)print(juli)print(res)str1 = ''for jk in res:j = 0str1 = str(str1) + jkj = j + 1if (j >= len(res) - 2):breakelse:str1 = str1 + '->'print(str1)label1 = tkinter.Label(tk, text=str1)label1.place(x=0, y=270)list4 = {}j = 0for ii in res:list4[j] = iij = j + 1for i in range(len(res)-1):g.attr('edge', dir='forward')g.edge(list4[i],list4[i+1],color='red')g.attr('edge', dir='forward')g.node(list4[0],shape='doublecircle',style='filled',color='red')g.render("2.gv", view=False)#img = cv2.imread("2.gv.png")#h = cv2.resize(img, (300, 565))#cv2.imwrite("img.png", h)#render = tkinter.PhotoImage(file="./img.png")render = tkinter.PhotoImage(file="./2.gv.png")la = tkinter.Label(tk, image=render, width=800, height=800)la.place(x=700, y=0)tk.mainloop()button5=tkinter.Button(tk,text="深度度优先搜索最短路径",command=dfs1)
button5.place(x=200,y=340)button7=tkinter.Button(tk,text="深度度优先搜索",command=depth_serach)
button7.place(x=200,y=240)
def clear():global min1,dismin1=9999999dis=0#book=[0]*len(list1)#path=[0]*len(list1)g.clear(keep_attrs = False )del adrect[length:len(list1)]for i in range(len(adrect)):del adrect[i][length:len(list1)]x=len(list1)a=[]for j in range(length,x):a.append(list1[j])for i in a:list2.pop(i)del list1[length:x]print(adrect)print(list1)print(list2)button6=tkinter.Button(tk,text="清空",command=clear)
button6.place(x=620,y=100)
def min_distance():start = time.time()a=djstla.get()b=djstla1.get()hh=adrectdistances={}for i in range(len(list1)):distances[list1[i]]={}print(distances)for i in range(len(list1)):for j in range(len(list1)):if(hh[i][j]>0):distances[list1[i]][list1[j]]=hh[i][j]print(distances)nodes=list1unvisited={node:9999999 for node in nodes}current=acurrentdistance=0visited={}router={}routlist=[]while True:key_tos={}for neighbor,distance in distances[current].items():if(neighbor not in unvisited):continuenewdistance=currentdistance+distanceif(unvisited[neighbor]==9999999 or unvisited[neighbor]>newdistance):unvisited[neighbor]=newdistancekey_tos [neighbor]=currentprint(key_tos)for key in key_tos:router[key]=key_tos[key]print(router)visited[current]=currentdistancedel unvisited[current]if not unvisited:breakafter=[node for node in unvisited.items() ]#将unvisited转为列表元祖current,currentdistance=sorted(after,key=lambda x:x[1])[0]#选路径最短的print(visited)print(router)def rout(b):if(b!=a):for key in router:if(b==key):print(router[key])routlist.append(router[key])rout(router[b])rout(b)routlist.insert(0,b)routlist.reverse()print(routlist)for i in visited:if(i==b):print(visited[i])end = time.time()print(str(end-start))label5 = tkinter.Label(tk, text="dijkstra最短距离为:"+str(visited[b])+"   ")label5.place(x=200, y=120)label6 = tkinter.Label(tk, text="运行时间:" + str(end-start)+ "   ")label6.place(x=200, y=150)list4 = {}j = 0for ii in routlist:list4[j] = iij = j + 1for i in range(len(routlist) - 1):g.attr('edge', dir='forward')g.edge(list4[i], list4[i + 1], color='red')g.attr('edge', dir='forward')g.node(list4[i], shape='doublecircle',style='filled',color='red')g.node(list4[len(routlist)-1],shape='doublecircle',style='filled',color='red')g.render("2.gv", view=False)#img = cv2.imread("2.gv.png")# img = cv2.imread("2.gv.png")# h = cv2.resize(img, (550, 750))#cv2.imwrite("img.png", h,[int(cv2.IMWRITE_PNG_COMPRESSION), 0])#cv2.imwrite("123.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])#render = tkinter.PhotoImage(file="./img.png")render = tkinter.PhotoImage(file="./2.gv.png")la = tkinter.Label(tk, image=render, width=800, height=800)la.place(x=700, y=0)tk.mainloop()
button7=tkinter.Button(tk,text="dijkstra最短路径",command=min_distance)
button7.place(x=500,y=90)
tkinter.mainloop()

python 深度优先最短路径,广度优先最短路径,dijkstra最短路径及可视化相关推荐

  1. java并行运算最短路径,并行BGL - Dijkstra最短路径

    然而,我遇到的第一个问题是,我的Windows HPC MPI和boost 1.63无法识别以下行: typedef mpi :: process_group process_group_type; ...

  2. python广度优先算法最短路径_最短路径问题的Dijkstra算法 -python

    最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树>    .该算法常 ...

  3. 使用广度优先搜索找到最短路径

    by Sachin Malhotra 由Sachin Malhotra 使用广度优先搜索找到最短路径 (Finding Shortest Paths using Breadth First Searc ...

  4. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  5. 【最短路径】之Dijkstra算法

    最短路径 单源最短路径:计算源点到其他各顶点的最短路径的长度 全局最短路径:图中任意两点的最短路径 Dijkstra.Bellman-Ford.SPFA求单源最短路径 Floyed可以求全局最短路径, ...

  6. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  7. Python访问街区所有节点最短路径问题,并结合matplotlib可视化

    Python访问街区所有节点最短路径问题,并结合matplotlib可视化 1. 效果图 2. 源码 2.1 5个点全排列(递归+非递归算法) 2.2 python遍历全路径计算距离+matplot可 ...

  8. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

  9. dijkstra最短路径算法视频_java实现Dijkstra算法求最短路径

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方 ...

最新文章

  1. 基于java nio的memcached客户端——xmemcached
  2. matlab引擎函数,Matlab引擎库函数
  3. java并发练习之快乐影院
  4. mt4 指标 涨跌幅 颜色k线_Tick级别K线显示指标
  5. python中的序列类型数据结构元素的切片_第四章 Python字符串以及(split,rsplit,replace,strip.....)...
  6. sql设为简单模式sql_SQL模式演练
  7. 从“智能湖仓”升级看数据平台架构未来方向
  8. JDK集合框架结构分析(二)
  9. 用ps绘制中国银行的标志
  10. iPhone iPad游戏应用开发视频教程
  11. html文字冒险游戏,小说新类型介绍之文字冒险游戏
  12. 自考c语言程序设计02600,自考02600《C语言程序设计》模拟试卷十一
  13. 实践系列:分销平台的技术架构
  14. Heterogeneous Graph Attention Network翻译
  15. 什么是组合(Composition),有什么作用
  16. 拆弹专家(密码BFS)
  17. 票据ticket实现方式java代码_Java代码实践12306售票算法(二)
  18. 百度阿里网易大疆等大小厂前端校招面筋
  19. Matlab Simulink 常用快捷操作和功能(1)
  20. 二叉树的中序遍历-递归和非递归算法

热门文章

  1. Python:终端打印字体颜色
  2. 数据对齐问题引发的API调用失败
  3. BA--冷源系统原理图解
  4. 这就是Tcpcopy
  5. python opencv入门 Hough圆变换(28)
  6. 一款超好用的Zheng站下载shen器SiteSucker Pro
  7. CentOS6.7 使用 cp 命令强制覆盖功能
  8. 聚星Note04 - 管理员登录
  9. Java学前训练:鬼谷子随意从2-99中选取了两个数
  10. 惠普财报:营收三连降,昔日IT巨头无力回春?