RT,调了两三天了QwQ
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void Read(T &x) {int f=1;x=0;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=x*10+(c^48);x*=f;}
template <class S>
inline void Sead(S &x) {char c=getchar();for(;(c>'Z'||c<'A')&&(c>'z'||c<'a');c=getchar());for(;(c<='Z'&&c>='A')||(c<='z'&&c>='a');c=getchar())x=x+c;}
const int N = 2333;
double kry[N], f[N][N][2];
int cry[N][2], dis[N][N];
int n, m, v, k;
inline void Floyd() {
for (int k = 1; k <= v; k ++)
for (int i = 1; i <= v; i ++)
for (int j = 1; j <= v; j ++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
return ;
}
inline void init() {
memset(dis, 0x3f, sizeof dis);
memset(f, (double)0x3f, sizeof f);
f[1][0][0] = 0.0;
f[1][1][1] = 0.0;
return ;
}
int main() {
init();
Read(n); Read(m); Read(v); Read(k);
for (int i = 1; i <= n; i ++) {
Read(cry[i][0]);
}
for (int i = 1; i <= n; i ++) {
Read(cry[i][1]);
}
for (int i = 1; i <= n; i ++) {
scanf("%lf", &kry[i]);
}
for (int i = 1, x, y, z; i <= k; i ++) {
Read(x); Read(y); Read(z);
dis[x][y] = min(dis[x][y], z);
dis[y][x] = min(dis[y][x], z);
}
Floyd();
// for (int i = 1; i <= n; i ++) {
// for (int j = 1; j <= n; j ++) {
// printf("%d ", dis[i][j]);
// }
// printf("\n");
// }
// for (int i = 1; i <= n; i ++) {
// printf("%.2f ", kry[i]);
// }
// cout << endl;
for (int i = 2; i <= n; i ++) {
f[i][0][0] = f[i - 1][0][0] + dis[cry[i - 1][0]][cry[i][0]];
printf("%.2f\n", f[i][0][0]);
for (int j = 1; j <= min(i, m); j ++) {
f[i][j][0] = min(
f[i - 1][j][0] +
dis[cry[i - 1][0]][cry[i][0]],
f[i - 1][j][1] +
kry[i - 1] * dis[cry[i - 1][1]][cry[i][0]] +
(1.0 - kry[i - 1]) * dis[cry[i - 1][0]][cry[i][0]]);
// cout << f[i - 1][j][0] + dis[cry[i - 1][0]][cry[i][0]] << " &&&&&&&& " << f[i - 1][j][1] + kry[i - 1] * dis[cry[i - 1][1]][cry[i][0]] + (1.0 - kry[i - 1]) * dis[cry[i - 1][0]][cry[i][0]] << endl;
printf("%.2f ", f[i][j][0]);
f[i][j][1] = min(
f[i - 1][j - 1][0] +
kry[i] * dis[cry[i - 1][0]][cry[i][1]] +
(1.0 - kry[i]) * dis[cry[i - 1][0]][cry[i][0]],
f[i - 1][j - 1][1] +
kry[i - 1] * kry[i] * dis[cry[i - 1][1]][cry[i][1]] +
kry[i - 1] * (1.0 - kry[i]) * dis[cry[i - 1][1]][cry[i][0]] +
(1.0 - kry[i - 1]) * kry[i] * dis[cry[i - 1][0]][cry[i][1]] +
(1.0 - kry[i - 1]) * (1.0 - kry[i]) * dis[cry[i - 1][0]][cry[i][0]]);
// cout << f[i - 1][j - 1][0] + kry[i] * dis[cry[i - 1][0]][cry[i][1]] + (1.0 - kry[i]) * dis[cry[i - 1][0]][cry[i][0]] << " &&&&&&&& " << f[i - 1][j - 1][1] + kry[i - 1] * kry[i] * dis[cry[i - 1][1]][cry[i][1]] + kry[i - 1] * (1.0 - kry[i]) * dis[cry[i - 1][1]][cry[i][0]] + (1.0 - kry[i - 1]) * kry[i] * dis[cry[i - 1][0]][cry[i][1]] + (1.0 - kry[i - 1]) * (1.0 - kry[i]) * dis[cry[i - 1][0]][cry[i][0]] << endl;
printf("%.2f\n", f[i][j][1]);
}
}
double ans = 1e9 + 7;
for (int i = 0; i <= m; i ++) {
ans = min(ans, min(f[n][i][0], f[n][i][1]));
}
printf("%.2f", ans - 5e-3);
return 0;
}
/*
4.00
4.00 3.60
4.00 3.60
8.00
7.20 4.60
7.20 8.20
*/