52pts求调
查看原帖
52pts求调
608273
___PatrickChen___楼主2024/9/29 13:45
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

using ll = long long;

const ll N = 2005, V = 305;

int n, m, v, e, c[N], d[N];
double k[N], mp[V][V], dp[N][N][2], ans = 1e18;

void init() {}

void solve() {
	cin >> n >> m >> v >> e;
	for (int i = 1; i <= n; ++i) cin >> c[i];
	for (int i = 1; i <= n; ++i) cin >> d[i];
	for (int i = 1; i <= n; ++i) cin >> k[i];
	for (int i = 1; i <= v; ++i) {
		for (int j = 1; j <= v; ++j) {
			if (i == j) mp[i][j] = 0;
			else mp[i][j] = 1e18;
		}
	}
	while (e--) {
		int u, v;
		double w;
		cin >> u >> v >> w;
		mp[u][v] = mp[v][u] = min(mp[u][v], w);
	}
	for (int i = 1; i <= v; ++i) {
		for (int j = 1; j <= v; ++j) {
			for (int k = 1; k <= v; ++k) mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
		}
	}
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= m; j++) dp[i][j][0] = dp[i][j][1] = 1e18;
	}
	dp[1][0][0] = dp[1][1][1] = 0;
	for (int i = 2; i <= n; ++i) {
		dp[i][0][0] = dp[i - 1][0][0] + mp[c[i - 1]][c[i]];
		for (int j = 1; j <= min(i, m); ++j) {
			dp[i][j][0] = min({dp[i][j][0],

			                   dp[i - 1][j][0] +
			                   mp[c[i - 1]][c[i]],

			                   dp[i - 1][j][1] +
			                   mp[c[i - 1]][c[i]] * (1 - k[i - 1]) +
			                   mp[d[i - 1]][c[i]] * k[i - 1]
			                  });
			dp[i][j][1] = min({dp[i][j][1],

			                   dp[i - 1][j - 1][0] +
			                   mp[c[i - 1]][c[i]] * (1 - k[i]) +
			                   mp[c[i - 1]][d[i]] * k[i],

			                   dp[i - 1][j - 1][1] +
			                   mp[d[i - 1]][d[i]] * k[i] * k[i - 1] +
			                   mp[d[i - 1]][c[i]] * k[i - 1] * (1 - k[i]) +
			                   mp[c[i - 1]][d[i]] * (1 - k[i - 1]) * k[i] +
			                   mp[c[i - 1]][c[i]] * (1 - k[i - 1]) * (1 - k[i])
			                  });
		}
	}
	for (int i = 0; i <= m; i++) ans = min({ans, dp[n][i][0], dp[n][i][1]});
	cout << fixed << setprecision(2) << ans << endl;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	init();
	while (_--) solve();
	return 0;
}
2024/9/29 13:45
加载中...