88 pts WA 求助
查看原帖
88 pts WA 求助
610557
shinzanmonoszm 妹妹楼主2023/6/2 10:13
#include<iostream>
#include<algorithm>
#include<iomanip>
const int sz = 2010;
const int vsz = 310;
const int inf = 0x3fffffff;
double f[sz][sz][2], p[sz];
int c[sz], d[sz], dis[vsz][vsz];
int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int n, m, v, e;
    std::cin >> n >> m >> v >> e;
    for (int i = 1; i <= n; i++) std::cin >> c[i];
    for (int i = 1; i <= n; i++) std::cin >> d[i];
    for (int i = 1; i <= n; i++) std::cin >> p[i];
    for (int i = 1; i <= v; i++)
        std::fill(dis[i] + 1, dis[i] + v + 1, inf), dis[i][i] = 0;
    while (e--) {
        int a, b, w;
        std::cin >> a >> b >> w;
        dis[a][b] = dis[b][a] = std::min(w, dis[a][b]);
    }
    for (int k = 1; k <= v; k++)
        for (int i = 1; i <= v; i++)
            for (int j = 1; j <= v; j++)
                dis[i][j] = std::min(dis[i][j], dis[i][k] + dis[k][j]);
    for (int i = 1; i <= n; i++) 
        for (int j = 1; j <= m; j++)
            f[i][j][0] = f[i][j][1] = inf;
    f[1][0][0]=f[1][1][1]=0;
    for (int i = 2; i <= n; i++) {
        f[i][0][0]=f[i-1][0][0]+dis[c[i-1]][c[i]];
        f[i][0][1]=inf;
        for (int j = 1; j <= m; j++) {
            f[i][j][0]=std::min(f[i-1][j][0]+dis[c[i-1]][c[i]],f[i-1][j][1]+dis[c[i-1]][c[i]]*(1-p[i-1])+dis[d[i-1]][c[i]]*p[i-1]);
            f[i][j][1]=std::min(f[i-1][j-1][0]+dis[c[i-1]][d[i]]*p[i]+dis[c[i-1]][c[i]]*(1-p[i]),f[i-1][j-1][1]+dis[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])+dis[c[i-1]][d[i]]*(1-p[i-1])*p[i]+dis[d[i-1]][c[i]]*p[i-1]*(1-p[i])+dis[d[i-1]][d[i]]*p[i-1]*p[i]);
        }
    }
    double ans = inf;
    for (int i = 0; i <= m; i++)
        ans = std::min(ans, std::min(f[n][i][0], f[n][i][1]));
    printf("%.2lf", ans);
    return 0;
}
2023/6/2 10:13
加载中...