32pts求调
查看原帖
32pts求调
550957
Anonymely楼主2022/7/18 20:40
#include<bits/stdc++.h>
using namespace std;

const int N=2005;
#define inf 10000000
int c[N][3],d[N],mp[N][N];
double E[N],dp[N][N][2];
int n,m,v,e;

signed main() {
	cin>>n>>m>>v>>e;
	memset(mp,0x3f,sizeof(mp));
	for (int i=1; i<=n; i++) cin>>c[i][0];
	for (int i=1; i<=n; i++) cin>>c[i][1];
	for (int i=1; i<=n; i++) cin>>E[i];
	for (int i=1; i<=e; i++) {
		int q,u,w;
		cin>>q>>u>>w;
		mp[q][u]=mp[u][q]=min(mp[q][u],w);
	}
//	cout<<endl;
//	for (int i=1; i<=v; i++) {
//		for (int j=1; j<=v; j++) {
//			cout<<mp[i][j]<<' ';
//		}
//		cout<<endl;
//	}
	for (int k=1; k<=v; k++) {
		for (int i=1; i<=v; i++) {
			for (int j=1; j<=v; j++) {
				mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
			}
		}
	}
//	cout<<endl;
//	for (int i=1; i<=v; i++) {
//		for (int j=1; j<=v; j++) {
//			cout<<mp[i][j]<<' ';
//		}
//		cout<<endl;
//	}
	for (int i=1; i<=n; i++) mp[i][i]=mp[i][0]=mp[0][i]=0;
	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++) {
		dp[i][0][0]=dp[i-1][0][0]+mp[c[i-1][0]][c[i][0]];
		for (int j=1; j<=m; j++) {
			int c1=c[i-1][0],c2=c[i-1][1],c3=c[i][0],c4=c[i][1];
			dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+mp[c1][c3],dp[i-1][j][1]+mp[c1][c3]*(1-E[i-1])+mp[c2][c3]*E[i-1]));
			dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+mp[c1][c3]*(1-E[i])+mp[c2][c3]*E[i],dp[i-1][j-1][1]+mp[c2][c4]*E[i]*E[i-1]+mp[c2][c3]*E[i-1]*(1-E[i-1])+mp[c1][c4]*(1-E[i-1])*E[i]+mp[c1][c3]*(1-E[i-1])*(1-E[i])));
		}	
	}
	double 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;
}
2022/7/18 20:40
加载中...