'''
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(" ")))
# 用列表的Index快速获得
M = [0]
v1 = [0]
v2 = [0]
for _ in range(n):
t,v,v_ = list(map(int, input().split(" ")))
M.append(t)
v1.append(v)
v2.append(v_)
#存储边的关系
import collections
G = [collections.defaultdict(int) for _ in range(n+1)] #int id, t;
for _ in range(m):
n1, n2, t = list(map(int, input().split(" ")))
G[n1][n2] = t
G[n2][n1] = t
#dp[i][j] 从i景点出发,还剩下j分钟可以用时候,可以获得的期望happy(期望可以理解为平均值
dp1 = [[0 for _ in range(k+1)] for _ in range(n+1)]
dp2 = [[0 for _ in range(k+1)] for _ in range(n+1)]
#后更新时间
for j in range(1,k+1):
#先更新结点
for i in range(1,n+1):
happy1 = 0
happy2 = 0
cnt = 0
if j>=M[i]:
dp1[i][j] += v1[i]
dp2[i][j] += v2[i]
for id,time in G[i].items():
if j>=M[i]+time+M[id]:
happy1 += dp1[id][j-time - M[i]]
happy2 += dp2[id][j - time - M[i]]
cnt+=1
if happy1:
dp1[i][j] += happy1/cnt
dp2[i][j] += happy2 / cnt
ans1,ans2 = 0,0
for i in range(1,n+1): #假设所有的初始景点,都时间够玩
if not dp1[i][k]:
n-=1
continue
ans1 += dp1[i][k]
ans2 += dp2[i][k]
print('%.5f %.5f'% (ans1/n, ans2/n))
笔试题:旅游问题
最新推荐文章于 2022-08-27 16:45:39 发布