#lydlx03x0B01. 换教室

换教室

换教室

题目描述

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。

在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上。

课程安排

在第 ii (1in)(1 \le i \le n) 个时间段上:

  • 两节内容相同的课程同时在不同的地点进行
  • 牛牛预先被安排在教室 cic_i 上课
  • 另一节课程在教室 did_i 进行

申请规则

如果不提交任何申请,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程。

如果学生想更换第 ii 节课程的教室,则需要提出申请:

  • 若申请通过,学生就可以在第 ii 个时间段去教室 did_i 上课
  • 否则仍然在教室 cic_i 上课

申请概率

申请更换第 ii 节课程的教室时,申请被通过的概率是一个已知的实数 kik_i,并且对于不同课程的申请,被通过的概率是互相独立的。

申请限制

学校规定:

  • 所有的申请只能在学期开始前一次性提交
  • 每个人只能选择至多 mm 节课程进行申请
  • 牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请
  • 牛牛可以申请自己最希望更换教室的 mm 门课程,也可以不用完这 mm 个申请的机会,甚至可以一门课程都不申请

教室间移动

因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。

牛牛所在的大学有 vv 个教室,有 ee 条道路。

道路信息

  • 每条道路连接两间教室,并且是可以双向通行的
  • 通过不同的道路耗费的体力可能会有所不同
  • 当第 ii (1in1)(1 \le i \le n-1) 节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室

问题

牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。

输入格式

第一行四个整数 n,m,v,en, m, v, e

  • nn 表示这个学期内的时间段的数量
  • mm 表示牛牛最多可以申请更换多少节课程的教室
  • vv 表示牛牛学校里教室的数量
  • ee 表示牛牛的学校里道路的数量

第二行 nn 个正整数,第 ii 个正整数表示 cic_i,即第 ii 个时间段牛牛被安排上课的教室;保证 1civ1 \le c_i \le v

第三行 nn 个正整数,第 ii 个正整数表示 did_i,即第 ii 个时间段另一间上同样课程的教室;保证 1div1 \le d_i \le v

第四行 nn 个实数,第 ii 个实数表示 kik_i,即牛牛申请在第 ii 个时间段更换教室获得通过的概率;保证 0ki10 \le k_i \le 1

接下来 ee 行,每行三个正整数 aj,bj,wja_j, b_j, w_j,表示有一条双向道路连接教室 aj,bja_j, b_j,通过这条道路需要耗费的体力值是 wjw_j;保证 1aj,bjv,1wj1001 \le a_j, b_j \le v, 1 \le w_j \le 100

数据范围

保证:

  • 1n20001 \le n \le 2000
  • 0m20000 \le m \le 2000
  • 1v3001 \le v \le 300
  • 0e900000 \le e \le 90000
  • 保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室
  • 保证输入的实数最多包含 3 位小数

输出格式

输出一行,包含一个实数,四舎五入精确到小数点后恰好 2 位,表示答案。

注意: 你的输出必须和标准输出完全一样才算正确。

测试数据保证四舎五入后的答案和准确答案的差的绝对值不大于 4×1034 \times 10^{-3}

输入样例

3 2 3 3
2 1 2
1 2 1
0.8 0.2 0.5 
1 2 5
1 3 3
2 3 1

输出样例

2.80

样例解释

输入数据说明

  • n=3n = 3:3个时间段
  • m=2m = 2:最多可以申请2次
  • v=3v = 3:3个教室
  • e=3e = 3:3条道路

课程安排:

  • c=[2,1,2]c = [2, 1, 2]:原定教室
  • d=[1,2,1]d = [1, 2, 1]:可选教室
  • k=[0.8,0.2,0.5]k = [0.8, 0.2, 0.5]:申请通过概率

道路:

  1. 教室1 ↔ 教室2,距离5
  2. 教室1 ↔ 教室3,距离3
  3. 教室2 ↔ 教室3,距离1

最优策略

最优策略是申请第1和第3节课。

情况分析:

第1节课: 申请更换教室

  • 概率0.8通过:去教室1
  • 概率0.2不通过:去教室2

第2节课: 不申请

  • 一定去教室1(原定教室)

第3节课: 申请更换教室

  • 概率0.5通过:去教室1
  • 概率0.5不通过:去教室2

计算期望体力值

首先计算教室间最短距离(Floyd算法):

  • dist(1,1) = 0
  • dist(1,2) = min(5, 3+1=4) = 4
  • dist(1,3) = 3
  • dist(2,1) = 4
  • dist(2,2) = 0
  • dist(2,3) = 1
  • dist(3,1) = 3
  • dist(3,2) = 1
  • dist(3,3) = 0

考虑所有可能的申请结果组合:

组合1: 第1节申请通过(0.8),第3节申请通过(0.5) 概率:0.8 × 0.5 = 0.4 路径:教室1 → 教室1 → 教室1 距离:dist(1,1) + dist(1,1) = 0 + 0 = 0

组合2: 第1节申请通过(0.8),第3节申请不通过(0.5) 概率:0.8 × 0.5 = 0.4 路径:教室1 → 教室1 → 教室2 距离:dist(1,1) + dist(1,2) = 0 + 4 = 4

组合3: 第1节申请不通过(0.2),第3节申请通过(0.5) 概率:0.2 × 0.5 = 0.1 路径:教室2 → 教室1 → 教室1 距离:dist(2,1) + dist(1,1) = 4 + 0 = 4

组合4: 第1节申请不通过(0.2),第3节申请不通过(0.5) 概率:0.2 × 0.5 = 0.1 路径:教室2 → 教室1 → 教室2 距离:dist(2,1) + dist(1,2) = 4 + 4 = 8

期望体力值:

$E = 0.4×0 + 0.4×4 + 0.1×4 + 0.1×8 = 0 + 1.6 + 0.4 + 0.8 = 2.8$

输出:2.80

关键点

  1. 期望值计算:需要考虑所有申请结果的概率组合
  2. 最短路径:需要使用Floyd算法预计算所有教室对之间的最短距离
  3. 动态规划:需要设计DP状态表示前i节课,申请了j次,第i节课是否申请
  4. 精度要求:输出保留2位小数,需要四舍五入

时空限制

  • 时间限制:1秒
  • 空间限制:128MB