社区讨论
小疑问
灌水区参与者 2已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @m1nnjznd
- 此快照首次捕获于
- 2024/09/29 22:04 去年
- 此快照最后确认于
- 2024/09/30 12:13 去年
CPP
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N = 2010;
const int M = 310;
int c[N], d[N];
double k[N];
double g[N][N];
double dp[N][N][2];
int n, m, v, e;
void floyd () {
for (int k = 1; k <= v; k ++ ) {
for (int i = 1; i <= v; i ++ ) {
// if (i == k || g[i][k] == 1e9) continue;
for (int j = 1; j < i; j ++ ) {
g[i][j] = g[j][i] = min (g[i][j], g[i][k] + g[k][j]);
}
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
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];
// memset(g, 0x3f, sizeof(g)); 这个
for (int i = 1; i <= v; i ++ ) {
for (int j = 1; j < i; j ++ ) {
g[i][j] = g[j][i] = 1e9;
}
} // 这个
for (int i = 1; i <= e; i ++ ) {
int a, b;
double w;
cin >> a >> b >> w;
g[a][b] = g[b][a] = min (g[a][b], w);
}
floyd();
for (int i = 1; i <= n; i ++ ) {
for (int j = 0; j <= m; j ++ ) {
dp[i][j][0] = dp[i][j][1] = 1e9;
}
}
dp[1][0][0] = dp[1][1][1] = 0;
for (int i = 2; i <= n; i ++ ) {
for (int j = 0; j <= min (m, i); j ++ ) {
dp[i][j][0] = min(dp[i - 1][j][0] + g[c[i - 1]][c[i]], dp[i - 1][j][1] +
g[d[i - 1]][c[i]] * k[i - 1] + g[c[i - 1]][c[i]] * (1 - k[i - 1]));
if (j != 0) {
dp[i][j][1] = min(dp[i - 1][j - 1][0] + g[c[i - 1]][d[i]] * k[i] +
g[c[i - 1]][c[i]] * (1 - k[i]),
dp[i - 1][j - 1][1] + g[c[i - 1]][c[i]] * (1 - k[i - 1]) * (1 - k[i]) +
g[c[i - 1]][d[i]] * (1 - k[i - 1]) * k[i] + g[d[i - 1]][c[i]] * (1 - k[i]) *
k[i - 1] + g[d[i - 1]][d[i]] * k[i - 1] * k[i]);
}
}
}
double ans = 1e9;
for (int i = 0; i <= m; i ++ ) {
ans = min(ans, min(dp[n][i][1], dp[n][i][0]));;
// cout << dp[n][i][0] << " " << dp[n][i][1] << "\n";
}
printf ("%.2lf\n", ans);
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...