1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include<bits/stdc++.h> #define dwb double
using namespace std;
const int MAXN = 2005; const int MAXV = 305; const dwb INF = 1e9 + 7;
int n, m, v, e; int dis[MAXV][MAXV]; int c[MAXN], d[MAXN]; dwb p[MAXN]; dwb f[MAXN][MAXN][2];
int main() { memset(dis, 0x3f, sizeof(dis)); scanf("%d%d%d%d", &n, &m, &v, &e); for (int i = 1; i <= n; ++i) scanf("%d", &c[i]); for (int i = 1; i <= n; ++i) scanf("%d", &d[i]); for (int i = 1; i <= n; ++i) scanf("%lf", &p[i]); for (int i = 1; i <= e; ++i) { int from, to, weight; scanf("%d%d%d", &from, &to, &weight); dis[from][to] = min(dis[from][to], weight); dis[to][from] = min(dis[to][from], weight); } for (int i = 1; i <= v; ++i) for (int j = 1; j <= v; ++j) for (int k = 1; k <= v; ++k) dis[j][k] = min(dis[j][k], dis[i][j] + dis[i][k]); for (int i = 1; i <= v; ++i) dis[i][i] = 0;
for (int i = 1; i <= n; ++i) for (int j = 0; j <= m; ++j) { f[i][j][0] = INF; f[i][j][1] = INF; }
f[1][0][0] = 0; f[1][1][1] = 0; for (int i = 2; i <= n; ++i) { dwb disCC = dis[c[i - 1]][c[i]]; dwb disCD = dis[c[i - 1]][d[i]]; dwb disDC = dis[d[i - 1]][c[i]]; dwb disDD = dis[d[i - 1]][d[i]];
f[i][0][0] = f[i - 1][0][0] + disCC;
for (int j = 1; j <= min(i, m); ++j) { f[i][j][0] = min(f[i][j][0], f[i - 1][j][0] + disCC); f[i][j][0] = min(f[i][j][0], f[i - 1][j][1] + disDC * p[i - 1] + disCC * (1 - p[i - 1]));
f[i][j][1] = min(f[i][j][1], f[i - 1][j - 1][0] + disCC * (1 - p[i]) + disCD * p[i]); f[i][j][1] = min(f[i][j][1], f[i - 1][j - 1][1] + disCC * (1 - p[i - 1]) * (1 - p[i]) + disCD * (1 - p[i - 1]) * p[i] + disDC * p[i - 1] * (1 - p[i]) + disDD * p[i - 1] * p[i]); } }
dwb ans = INF; for (int i = 0; i <= m; ++i) ans = min({ans, f[n][i][0], f[n][i][1]}); printf("%.2lf", ans);
return 0; }
|