学习的更多了..理解更深了..再来优化..

'''
n个点,m边,无向 无环 无重边
第1行: n,m,k 总共停留k分钟
接下来n行:mi,v1i,v2i n个点:n个景点,第i个景点花费mi分钟,愉悦度分别增加v1i,v2i
接下来m行:xi,yi,ti 代表第i条边
初始愉悦度均为0
每游览完一个景点后,游游和小伙伴会 等概率随机选择一个可以从当前景点直达的 且来得及玩的景点作为下一个目的地
如果游览完一个景点后周围没有可以直达的且来得及游览的景点,游游和小伙伴就会提前结束游玩。
请分别计算出游游和小伙伴在游览结束后愉悦度的期望。
输入:
5 4 60
25 12 83
30 38 90
16 13 70
22 15 63
50 72 18
2 1 7
3 1 7
4 3 1
5 3 10
输出:
39.20000 114.40000
https://www.nowcoder.com/test/question/done?tid=32132700&qid=365969#summary
'''
n,m,k = list(map(int ,input().split(" ")))
#import collections
class Node:
    def __init__(self,id,time,v1,v2):
        self.id = id
        self.neibor = dict()
        #self.visited = False
        self.time = time
        self.v1 = v1
        self.v2 = v2
    def addNeibor(self,id,time_z):
        self.neibor[id] = time_z


#构建图
nodeList = [0]#1,2,...n
for i in range(n):
    tmp = list(map(int ,input().split(" ")))
    nodeList.append(Node(i+1, tmp[0],tmp[1],tmp[2]))
#print(nodeList) #n
for i in range(m):
    id1,id2,time = list(map(int, input().split(" ")))
    nodeList[id1].addNeibor(id2, time)
    nodeList[id2].addNeibor(id1, time)

#遍历图,计算期望
def bfs(id,p): #开始id
    #进栈就认为游览完了
    happy1=0
    happy2=0
    que = [(nodeList[id],k-nodeList[id].time,nodeList[id].v1,nodeList[id].v2,p)]
    while que:
        cur,cur_t,cur_v1,cur_v2,tmp_prob = que.pop(0)
        #print(cur)
        if cur.neibor:
            lenth = 0
            for id,t in cur.neibor.items():
                if nodeList[id].time+t<= cur_t: #这里有问题..
                    lenth+=1
            if lenth>0:
                tmp_prob *= 1 /lenth
                for id, t in cur.neibor.items():
                    if nodeList[id].time + t <= cur_t:
                        que.append((nodeList[id], cur_t-nodeList[id].time-t, cur_v1+ nodeList[id].v1, cur_v2+ nodeList[id].v2,tmp_prob))
                continue
        happy1 += cur_v1*tmp_prob
        happy2 += cur_v2*tmp_prob
    return happy1,happy2

h1,h2 = 0,0
for i in range(1,n+1):
    t1,t2 = bfs(i, 1/n)
    h1+=t1
    h2+=t2
print('%.5f %.5f'% (h1,h2))
#运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
#case通过率为45.45%
    




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值