16pts 求调
查看原帖
16pts 求调
700558
williamwei楼主2024/7/20 17:21
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 300 + 10;
const int maxn = 2000 + 10;
const int inf = 1000;
int n, m, v, e, a[maxn], b[maxn], g[N][N];
double c[maxn], f[maxn][maxn][2];
void chmin(double& a, double b) {a = min(a, b);}
#define W(a, b, x) (x * a + (1 - x) * b)
int main() {
    ios::sync_with_stdio(false);
    cin >> n >> m >> v >> e;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) cin >> b[i];
    for (int i = 1; i <= n; i++) cin >> c[i];
    for (int i = 1; i <= v; i++)
        for (int j = 1; j <= v; j++)
            if (i != j) g[i][j] = inf;
    for (int i = 1; i <= e; i++) {
        int u, v, w; cin >> u >> v >> w;
        g[u][v] = g[v][u] = min(g[u][v], w);
    }
    for (int k = 1; k <= v; k++)
        for (int u = 1; u <= v; u++)
            for (int V = 1; V <= v; V++)
                g[u][V] = min(g[u][V], g[u][k] + g[k][V]);
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= m; j++) {
            f[i][j][0] = f[i - 1][j][0] + g[a[i - 1]][a[i]];
            chmin(f[i][j][0], f[i - 1][j][1] + W(g[b[i - 1]][a[i]], g[a[i - 1]][a[i]], c[i - 1]));
            if (!j) continue;
            f[i][j][1] = f[i - 1][j - 1][0] + W(g[a[i - 1]][b[i]], g[a[i - 1]][a[i]], c[i]);
            double A = c[i] * c[i - 1], B = c[i - 1] - A, C = c[i] - A, D = 1 - A - B - C;
            if (j > 1) chmin(f[i][j][1], f[i - 1][j - 1][1] + A * g[b[i - 1]][b[i]] + B * g[b[i - 1]][a[i]] + C * g[a[i - 1]][b[i]] + D * g[a[i - 1]][a[i]]);
        }
    double ans = 1e100;
    for (int i = 0; i <= m; i++)
        for (int j = 0; j < 2; j++)
            if (i || !j) chmin(ans, f[n][i][j]);
    cout << fixed << setprecision(2) << ans << '\n';
    return 0;
}

给个hack也行

2024/7/20 17:21
加载中...