P1850求助
  • 板块题目总版
  • 楼主wangif424
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/7/6 15:22
  • 上次更新2023/11/3 11:20:01
查看原帖
P1850求助
521283
wangif424楼主2023/7/6 15:22
#include<bits/stdc++.h>
#define int long long
#define inf 100000000
using namespace std;
int n,m,v,e;
int c[2001],d[2001];
double k[2001],dp[2001][2001][2],ans,t[301][301];
signed main() {
	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<=e; i++){
		for(int j=1; j<=e; j++){
			t[i][j]=inf;
		}
	}
	for(int i=1; i<=e; i++) {
		int a,b;
		double w;
		cin >> a >> b >> w;
		if(a==b)continue;
		t[a][b]=t[b][a]=min(t[a][b],w);
	}
	for(int q=1; q<=e; q++) {
		for(int i=1; i<=e; i++) {
			for(int j=1; j<i; j++) {
				t[j][i]=t[i][j]=min(t[i][j],t[i][q]+t[q][j]);
			}
		}
	}
	for(int i=0; i<=n; i++) {
		for(int j=0; j<=m; j++) {
			dp[i][j][0]=dp[i][j][1]=inf;
		}
	}
	dp[1][0][0]=dp[1][1][1]=0;
	for(int i=2; i<=n; i++) {
		for(int j=0; j<=min(i,m); j++) {
			dp[i][j][0]=min( dp[i-1][j][0] + t[c[i-1]][c[i]]   ,   dp[i-1][j][1] + k[i-1] * t[d[i-1]][c[i]] + (1-k[i]) * t[c[i-1]][c[i]] );
			dp[i][j][1]=min( dp[i-1][j-1][0] + k[i] * t[c[i-1]][d[i]] + (1 - k[i]) * t[c[i-1]][c[i]]   ,   dp[i-1][j-1][1] + k[i] * (k[i-1] * t[d[i-1]][d[i]] + (1-k[i-1]) * t[c[i-1]][d[i]]) + (1-k[i]) * (k[i-1] * t[d[i-1]][c[i]] + (1 - k[i-1]) * t[c[i-1]][c[i]])  );
		}
	}
	ans=inf;
	for(int i=0; i<=m; i++) {
		ans = min( ans ,min(dp[n][i][0] , dp[n][i][1]));
	}
	printf("%.2lf",ans);
	return 0;
}

调了半天,样例都过不了

2023/7/6 15:22
加载中...