python实现街区最短路径问题

参考:https://blog.csdn.net/qq_25245961/article/details/77522141

描述 
一个街区有很多住户,街区的街道只能为东西、南北两种方向。

住户只可以沿着街道行走。

各个街道之间的间隔相等。

用(x,y)来表示住户坐在的街区。

例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

现在要建一个邮局,使得各个住户到邮局的距离之和最少。

求现在这个邮局应该建在那个地方使得所有住户距离之和最小;

输入 
第一行一个整数n<20,表示有n组测试数据,下面是n组数据; 
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0 < x,y < 100,表示某个用户所在街区的坐标。 
m行后是新一组的数据;

输出 
每组数据输出到邮局最小的距离和,回车结束; 

这个题目的特点是要对蛮力法进行优化。 
算法思想: 
可以先对x轴进行遍历,从1到100的每个横坐标点到输入点(x,y)的横坐标的距离和的最小值记为xmin; 
同理,然后对y轴进行遍历,从1到100的每个纵坐标点到输入点(x,y)的纵坐标的距离和的最小值记为ymin; 
求sum = xmin + ymin即为最小距离和。 
算法复杂度:O(m*n),循环次数最多为100*20。

n = input('请输入组数<20:')
n = int(n)
biglist = []
for _ in range(n):

    xmin = 2 ** 32
    ymin = 2 ** 32
    sums = 2 ** 32
    sublist = []
    m = input('请输入坐标组数<100:')
    m = int(m)
    for _ in range(m):
        sublist.append(list(map(int, input().strip().split()[:2])))
    print(sublist[0])       # [1, 2]

    i=1
    for i in range(101):
        if xmin>sums:
            xmin = sums
        sums = 0
        k = 0
        while k<m:
            sums += abs(i-sublist[k][0])
            k += 1
    print('x轴方向最小和:',xmin)

    sums = 2**32
    j = 1
    for j in range(101):
        if ymin > sums:
            ymin = sums
        sums = 0
        k = 0
        while k < m:
            sums += abs(j - sublist[k][1])
            k += 1

    print('y轴方向最小和:', ymin)
    print('最小距离和是:',xmin+ymin)

.
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
最短路径问题是图论中的一个重要问题,它的目标是在一个有向图中找到两个节点之间的最短路径。常用的算法有Dijkstra算法和floyd算法。 Dijkstra算法是一种贪心算法,它从起点开始,每次选择距离起点最近的一个节点,并更新与该节点相邻的节点的距离。通过这种方式,逐步扩展最短路径的范围,直到找到终点为止。Dijkstra算法的时间复杂度为O(n^2),其中n为节点数。 floyd算法是一种动态规划算法,它通过中间节点来更新两个节点之间的距离。具体来说,floyd算法维护一个距离矩阵,其中d[i][j]表示从节点i到节点j的最短路径长度。然后,通过枚举中间节点k,更新d[i][j]的值。floyd算法的时间复杂度为O(n^3)。 下面是用python语言实现Dijkstra算法和floyd算法的代码: Dijkstra算法: ```python import heapq def dijkstra(graph, start): dist = {node: float('inf') for node in graph} dist[start] = 0 heap = [(0, start)] while heap: (d, node) = heapq.heappop(heap) if d > dist[node]: continue for neighbor, weight in graph[node].items(): new_dist = dist[node] + weight if new_dist < dist[neighbor]: dist[neighbor] = new_dist heapq.heappush(heap, (new_dist, neighbor)) return dist ``` floyd算法: ```python def floyd(graph): n = len(graph) dist = [[float('inf')]*n for _ in range(n)] for i in range(n): for j in range(n): if i == j: dist[i][j] = 0 elif j in graph[i]: dist[i][j] = graph[i][j] for k in range(n): for i in range(n): for j in range(n): dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]) return dist ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值