Q31计算最短路径3

E:/GitHub/suanfaquti/Q31计算最短路径3.py
'''
获取路径的方法改成bfs。
n=8需要4s,n=9需要很久
'''

from itertools import permutations
from queue import Queue
import time,copy

def getWays(a,b):
    q1 = Queue()
    q1.put((1, 1))
    d={(1, 1):[]}
    while q1.qsize():
        x, y = q1.get()
        if x + y == 2 * n + 1:
            break
        if x < a:
            if (x + 1, y) not in q1.queue:
                q1.put((x + 1, y))
            r = copy.deepcopy(d[(x, y)])        #[ [1,0],[0,1] ]
            if not r or len(r)==0:
                r=[[1]]
            else:
                for i in r:
                    i.append(1)
            if (x + 1, y) not in d.keys():
                d[(x + 1, y)]=r
            else:
                d[(x + 1, y)].extend(r)
        if y < b:
            if (x, y+1) not in q1.queue:
                q1.put((x, y + 1))
            r = copy.deepcopy(d[(x, y)])
            if not r or len(r)==0:
                r=[[0]]
            else:
                for i in r:
                    i.append(0)
            if (x, y + 1) not in d.keys():
                d[(x , y + 1)]=r
            else:
                d[(x, y + 1)].extend(r)
    return d[(a,b)]

def getCnt(ways1,ways2):
    cnt = 0
    for way1 in ways1:
        for way2 in ways2:
            flag = 0
            lastPointIsSame = 1
            distance1, distance2 = 0, 0
            for i in range(len(way1)):
                distance1 += way1[i]
                distance2 += way2[i]
                if distance1 == distance2 and lastPointIsSame:
                    flag = 1
                    break
                elif distance1 != distance2:
                    lastPointIsSame = 0
                else:
                    lastPointIsSame = 1
            if flag:
                continue
            cnt += 1
    return cnt

t1 = time.clock()
n = 8
ways1=getWays(n,n-1)
ways2=getWays(n-1,n)
print(time.clock() - t1)
print(getCnt(ways1,ways2)*2)            #100360  0.33159664533974464
print(time.clock() - t1)
在Qt中使用Dijkstra算法计算最短路径,可以按照以下步骤进行: 1. 定义节点类:节点类包括节点的ID、节点名称、出度边集合、入度边集合、起点到该节点的短距离、该节点是否已经被访问过等属性。 2. 定义边类:边类包括边的起点、终点、边权重等属性。 3. 创建图类:图类包括节点集合、边集合等属性,以及添加节点、添加边、删除节点、删除边等方法。 4. 实现Dijkstra算法:Dijkstra算法是一种单源最短路径算法,它通过维护一个集合S来保存已经确定了最短路径的节点,以及一个集合Q来保存还未确定最短路径的节点。算法从起点开始,依次将离起点近的节点加入集合S中,然后更新与这些节点相邻的节点的距离值。重复这个过程,直到所有节点都被加入集合S。 5. 在Qt中实现Dijkstra算法:在Qt中可以使用QList等容器类来保存节点集合、边集合,使用QMap等容器类来保存节点的ID、名称等信息。同时,可以使用QGraphicsView等类来实现图形界面展示。在实现Dijkstra算法时,可以使用QQueue等容器类来保存还未确定最短路径的节点,使用QMap等容器类来保存节点的短距离值和前驱节点等信息。 6. 实现图形界面:在Qt中可以使用QGraphicsScene和QGraphicsView等类来实现图形界面展示,可以通过鼠标点击等事件来添加节点、添加边、删除节点、删除边等操作。 总之,使用Qt实现Dijkstra算法计算最短路径,需要综合运用Qt的各种容器类、图形界面类、算法实现等技术,需要具备一定的编程能力和算法思维能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值