PAT (Advanced Level) Practice 1018 Public Bike Management(Python)## 未AC,测试点7错误,测试点9超时。

原题传送门

代码

# 输入数据
line = input().strip().split()
c, n, s, m = [int(x) for x in line]
line = input().strip().split()
bikes = [float('inf')]
for i in range(len(line)):
    bikes.append(int(line[i]) - c / 2)
roads = [{} for _ in range(n + 1)]
for i in range(m):
    line = input().strip().split()
    a, b, c = [int(x) for x in line]
    roads[a][b] = roads[b][a] = c
travseral = [False for _ in range(n + 1)]
distance = [float('inf') for _ in range(n + 1)]
travseral[0] = True
distance[0] = 0
pre_points = [[] for _ in range(n + 1)]  # 前驱节点
path = []
temp_path = []
min_need = float('inf')
min_back = float('inf')


# —————————————————————进入DFS核心代码—————————————————————
def DFS(v: int):
    global min_need
    global min_back
    global path
    global temp_path
    temp_path.append(v)
    if v == 0:
        need = 0
        back = 0
        # 打白条
        temp = temp_path[0:len(temp_path) - 1]
        temp.reverse()
        for each in temp:
            if bikes[each] > 0:  # 如果该站点的自行车多余
                back += bikes[each]
            elif back > -bikes[each]:  # 如果带回去的自行车能够填补该站点
                back += bikes[each]
            else:
                need += -back - bikes[each]
                back = 0
        if need < min_need:
            min_need = need
            min_back = back
            path = temp_path[0:]
        elif need == min_need and back < min_back:
            min_back = back
            path = temp_path
        else:
            pass
        temp_path.pop()
    else:
        for each in pre_points[v]:
            DFS(each)
        temp_path.pop()


# —————————————————————结束DFS核心代码—————————————————————
def main():
    # ————————————————————进入Dijkstra核心代码————————————————————
    # dijkstra算法,每次添加一个bike station
    for _ in range(n):
        min_distance = float('inf')
        station = -1  # 添加的车站
        temp_pre = []  # 添加的路径
        for j in range(n + 1):
            if travseral[j]:  # 该点已经被遍历
                for h in range(n + 1):
                    if not travseral[h]:
                        temp = int
                        if j == h:
                            temp = 0
                        elif h not in roads[j]:
                            temp = float('inf')
                        elif h in roads[j]:
                            temp = roads[j][h]
                        else:
                            pass
                        if distance[j] + temp < min_distance:
                            min_distance = distance[j] + temp
                            station = h
                            temp_pre = [j]
                        elif distance[j] + temp == min_distance and station == h:
                            temp_pre.append(j)
        pre_points[station] = temp_pre
        distance[station] = min_distance
        travseral[station] = True
    # ————————————————————结束Dijkstra核心代码————————————————————
    DFS(s)
    path.reverse()
    print(int(min_need), '->'.join(str(x) for x in path), int(min_back))


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值