1018 Public Bike Management (30 分) Python DFS

这个问题比较坑的一点就是注意调整沿途车的数量只在去程做,回程不做。也就是说,只有前往问题车站的路上才可以调整车辆。

使用DFS在做的时候,对每一个站点 i 会维护两个参数require和extra,表示在当前站点去程带去的车辆数和回程带回的车辆数。由于上面所述的那一点,每一站计算完成require和extra后,下一站只能由多出来的extra辆车去填补该站缺少的车,不能用该站多余的车填补前面几站缺少的车。也就是说,require只能增加,extra可增可减。明白这一点,问题就好解决了。

下面是Python3的AC代码:

cmax,n,sp,m = [int(x) for x in input().split() ]

C = [0] + [ int(x) for x in input().split() ]

Neib = [ {} for i in range(n+1) ]

for i in range(m):
    si,sj,t = [ int(x) for x in input().split() ]
    Neib[si][sj] = t
    Neib[sj][si] = t

minpath = []
minrequire = cmax+1
minextra = cmax+1
mindis = -1
vis = [0] * (n+1)
def dfs (Neib,path,dis,require,extra,st):
    global minrequire
    global minextra
    global mindis
    global minpath

    #print(path,dis,require,extra,st)

    vis[st] = 1
    if st == sp:
        if mindis == -1 or dis < mindis \
           or (dis == mindis and (require < minrequire or \
            require == minrequire and extra < minextra )):
            
                    minextra = extra
                    minrequire = require
                    mindis = dis
                    minpath = path
        vis[st] = 0
        return

    for i,t in Neib[st].items():
        if not vis[i]:
            #deal with need and take
            need,take = require,extra
            # get i's Current state
            diff = C[i] - cmax // 2
            # if i's state less than perfection
            if diff < 0 :
            # if take can feed i's need , decrease take
                if take >= (-diff) :
                    take += diff
            # if can't , let take be 0, increase need
                else:
                    
                    need += (-diff) - take
                    take = 0
            # if i's state more than perfection , just increase take
            # need can't be feed by i's state
            # the bike needed is used in adjusting the state before approching i's state
            # so we can just take more, can't need less
            # 2 test cases here.
            elif diff > 0:
                take += diff


            #dfs i
            dfs(Neib,path+[i],dis + t,need,take,i)
    vis[st] = 0


dfs(Neib,[0],0,0,0,0)
#print(minpath,minrequire,minextra,mindis)
strpath = '->'.join([str(x) for x in minpath])
print(minrequire,strpath,minextra)

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值