萌新88pts求助~
查看原帖
萌新88pts求助~
234168
Ayiirep楼主2020/12/4 19:18
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010, maxv = 310;
const long double inf = 1e15;
int n, m, v, e;
int c[maxn], d[maxn], dis[maxn][maxn];
long double p[maxn], f[maxn][maxn][2];
int main()
{
	scanf("%d%d%d%d", &n, &m, &v, &e);
	for(int i = 1; i <= n; ++i) scanf("%d", &c[i]);
	for(int i = 1; i <= n; ++i) scanf("%d", &d[i]);
	for(int i = 1; i <= n; ++i) scanf("%Lf", &p[i]);
	int a, b, w;
	for(int i = 1; i <= v; ++i) for(int j = i+1; j <= v; ++j) dis[i][j] = dis[j][i] = 1e9+7;
	for(int i = 1; i <= e; ++i) scanf("%d%d%d", &a, &b, &w), dis[a][b] = dis[b][a] = min(dis[a][b], w);
	for(int k = 1; k <= v; ++k)
		for(int i = 1; i <= v; ++i)
			for(int j = 1; j <= v; ++j)
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
	for(int i = 1; i <= v; ++i) dis[i][0] = dis[0][i] = 0;
	for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j) f[i][j][0] = f[i][j][1] = 1.0*inf;
	f[n][0][0] = f[n][0][1] = 0;
	for(int i = n-1; i >= 0; --i)
	{
		for(int j = 0; j <= min(m, n-i-1); ++j)
		{
			f[i][j][0] = min(f[i][j][0], f[i+1][j][0] + dis[c[i]][c[i+1]]);
			f[i][j][1] = min(f[i][j][1], f[i+1][j][0] + dis[d[i]][c[i+1]]);
			if(j == m) continue;
			f[i][j+1][0] = min(f[i][j+1][0], (1.0 - p[i+1]) * (f[i+1][j][0] + dis[c[i]][c[i+1]])
											+ p[i+1] * (f[i+1][j][1] + dis[c[i]][d[i+1]]));
			f[i][j+1][1] = min(f[i][j+1][1], (1.0 - p[i+1]) * (f[i+1][j][0] + dis[d[i]][c[i+1]])
											+ p[i+1] * (f[i+1][j][1] + dis[d[i]][d[i+1]]));
		}
	}
	long double ans = f[0][0][0];
	for(int i = 1; i <= m; ++i) 
		ans = min(ans, min(f[0][i][0], f[0][i][1]));
	printf("%.02Lf", ans);
	return 0;
}

WA了16,17,18三个点,想了很久也不知道错在哪,求dalao指点QwQ

2020/12/4 19:18
加载中...