WA52 求调
查看原帖
WA52 求调
1160620
ghy_jerami__楼主2024/11/22 18:05
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2010;
int n,m,v,e;
int c[N],d[N],dis[N][N];
double k[N],dp[N][N][2];
double ans=1e18;
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];
	
	for(int i=1;i<=v;i++) for(int j=1;j<=v;j++) dis[i][j]=(i!=j)*1e14;
	for(int i=1;i<=e;i++){
		int a,b,w;
		cin>>a>>b>>w;
		dis[a][b]=min(dis[a][b],w),dis[b][a]=min(dis[b][a],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=0;i<=n;i++) for(int j=0;j<=m;j++) dp[i][j][0]=dp[i][j][1]=1e14;
	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]+dis[c[i-1]][c[i]];
		for(int j=1;j<=min(i,m);j++){
			
			dp[i][j][0]=min(
				dp[i-1][j][0] + dis[c[i-1]][c[i]],
				dp[i-1][j][1] + k[i-1] * dis[d[i-1]][c[i]] + (1.0-k[i-1]) * dis[c[i-1]][c[i]]);
			
			dp[i][j][1]=min(
				dp[i-1][j-1][0] + k[i] * dis[c[i-1]][d[i]] + (1.0-k[i-1]) * dis[c[i-1]][c[i]],
				dp[i-1][j-1][1] + k[i-1]*k[i] * dis[d[i-1]][d[i]] + (1.0-k[i-1])*(1.0-k[i]) * dis[c[i-1]][c[i]] + k[i-1]*(1.0-k[i]) * dis[d[i-1]][c[i]] + (1.0-k[i-1])*k[i] * dis[c[i-1]][d[i]]);
			
		}
		
	}
	
	for(int i=0;i<=m;i++) ans=min(ans,min(dp[n][i][0],dp[n][i][1]));
	printf("%.2lf",ans);
	return 0; 
}
2024/11/22 18:05
加载中...