WA84pts求调
查看原帖
WA84pts求调
685964
shuqiang楼主2024/9/29 19:45
#include<iostream>
#include<iomanip>

using namespace std;

const int N = 1e3 * 2 + 10, M = 1e2 * 3 + 10, inf = 1e9;
int n, m, u, e, c[N], d[N], f[M][M], a, b, w;
double k[N], g[N][N][2], ans = inf;

int main(){
	for(int i = 0; i < M; i++){
		for(int j = 0; j < M; j++){
			f[i][j] = inf;
		}
		f[i][i] = 0;
	}
	cin >> n >> m >> u >> 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 = 0; i < e; i++){
		cin >> a >> b >> w;
		f[a][b] = min(f[a][b], w);
		f[b][a] = f[a][b];
	}
	for(int l = 1; l <= u; l++){
		for(int i = 1; i <= u; i++){
			for(int j = 1; j <= u; j++){
				f[i][j] = min(f[i][j], f[i][l] + f[l][j]);
			}
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 0; j <= m; j++){
			g[i][j][0] = g[i][j][1] = inf;
		}
	}
	g[1][0][0] = g[1][1][1] = 0;
	for(int i = 2; i <= n; i++){
		for(int j = 0; j <= min(m, i); j++){
			int c1 = c[i], c2 = c[i-1], d1 = d[i], d2 = d[i-1];
			double k1 = k[i], k2 = k[i-1];
			g[i][j][0] = min(g[i-1][j][1] + k2 * f[d2][c1] + (1-k2) * f[c2][c1], g[i-1][j][0] + f[c2][c1]);
			if(j > 0){
				g[i][j][1] = min(g[i-1][j-1][1] + k2 * k1 * f[d2][d1] + k2 * (1-k1) * f[d2][c1] + (1-k2) * k1 * f[c2][d1] + (1-k2) * (1-k1) * f[c2][d1], 
								 g[i-1][j-1][0] + k1 * f[c2][d1] + (1-k1) * f[c2][c1]);
			}
		}
	}
	for(int i = 0; i <= m; i++){
		ans = min(ans, min(g[n][i][0], g[n][i][1]));
	}
	cout << fixed << setprecision(2) << ans;
	return 0;
}
2024/9/29 19:45
加载中...