当前位置: 首页 » 综合知识 » it知识 » 正文

python最短路径问题如何解决

发布时间:2023-07-21 以下文章来源于网友投稿,内容仅供参考!

说明

1、最短路径问题是图论研究中的经典算法问题,用于计算从一个顶点到另一个顶点的最短路径。

2、最短路径问题有几种形式:确定起点的最短路径,确定终点的最短路径,确定起点和终点的最短路径,全局最短路径问题。

路径长度是将每个顶点到相邻顶点的长度记为1,而不是指两个顶点之间的道路距离——两个顶点之间的道路距离是连接边的权利。

实例

def findMin(row):
    minL = max(row)
    for i in row:
        if i != -1 and minL > i:
            minL = i
    return minL
def initRow(row, plus):
    r = []
    for i in row:
        if i != -1:
            i += plus
        r.append(i)
    return r
 
def getMinLen(table, e, t):
    count = len(table) - 1
    startPoint = 1
    #记录原点到各点最短距离 初始值为-1,即不可达
    lenRecord = list((-1 for i in range(count+1)))
    lenRecord[startPoint] = 0
    #记录每次循环的起点
    points = [startPoint]
    #已得到最短距离的点
    visited = set()
    while len(points)>0:
        #当前起点
        curPoint = points.pop()
        #原点到当前起点的距离
        curLen = lenRecord[curPoint]
        #当前起点到各点的距离
        curList = initRow(table[curPoint], t)
        #当前起点到各点的最短距离
        curMin = findMin(curList)
        visited.add(curPoint)
        idx = 0
        while idx<count:
            idx += 1
            #当前点不可达或到当前点的最短距离已计算出 则跳过
            if curList[idx] == -1 or idx in visited:
                continue
            #记录距离当前起点最近的点作为下次外层循环的起点
            if curList[idx] == curMin:
                points.append(idx)
            #如果从原点经当前起点curPoint到目标点idx的距离更短,则更新
            if lenRecord[idx] == -1 or lenRecord[idx] > (curLen+curList[idx]):
                lenRecord[idx] = curLen+curList[idx]
    return lenRecord[e]
 
def processInput():
    point, roat, jot = (int(x) for x in raw_input().split())
    table = []
    for i in range(point+1):
        table.append([-1] * (point+1))
    for i in range(roat):
        (x, y, w) = (int(n) for n in raw_input().split())
        if table[x][y] == -1 or table[x][y] > w:
            table[x][y] = w
            table[y][x] = w
    res = []
    for i in range(jot):
        e, t = (int(x) for x in raw_input().split())
        res.append(getMinLen(table, e, t))
    for i in res:
        print(i)
 
processInput()
  • • Linux Ecdsa密钥长度选择有何依据

    在Linux

  • • Linux Khook在内核监控中的应用如何

    Linux

  • • Linux Gsoap是否支持异步通信

    GSOAP是

  • • Linux Coremail如何提升用户体验

    提升Linu

  • • Linux Ecdsa算法有哪些局限性

    ECDSA

  • 哎呀音乐钢琴键盘学习《 钢琴主人训练营》 西瓜学琴
    郭蝈 陪练钢琴 30节课时 考级刚需 让孩子每一次练琴都是高质量的
    30天轻松学会五线谱 流行钢琴自学初级教程 牙牙学琴
    流行爵士钢琴实战技巧VIP课 - 继伟 哎呀音乐
    【海上钢琴师】原版 MT1990钢琴谱
    百首经典流行钢琴实战曲集 - 继伟
    雷费尔德电钢琴重锤88键专业考级儿童初学者数码电子钢琴家用
    小练咖 真人钢琴陪练 1v1服务 2999随时退 1课时50分钟 考级刚需
    雅马哈电钢琴88键重锤CLP735智能数码电子钢琴家用专业初学者考级
    【原装进口】Yamaha/雅马哈钢琴 b121 SC2原声静音钢琴
  • 珠海专业调钢琴
  • 天津宝坻区调钢琴
  • 天津静海区钢琴调音
  • 成都简阳市钢琴调律
  • 大连瓦房店市钢琴调音
  • 眉山调钢琴联系方式
  • 惠州大亚湾钢琴调琴师
  • 长治调琴师
  • 厦门湖里区钢琴调音师
  • 上海普陀区钢琴调音师