28pts 求条
查看原帖
28pts 求条
964645
pies_0x楼主2024/6/21 15:29

#include<cstdio>
#include<memory.h>
using namespace std;

#define N 305
#define T 2005
#define M 2005
#define min(a,b) ((a)<(b)?(a):(b))
#define min3(a,b,c) (min(a,min(b,c)))
#define min6(a,b,c,d,e,f) (min(min3(a,b,c),min3(d,e,f)))
#define inf 1e9

int n,m,v,e;
int c[T],d[T];
double k[T];
int map[N][N];
double dp[T][M][2];

signed main()
{
	scanf("%d%d%d%d",&n,&m,&v,&e);
	for(register int i=1;i<=n;++i)
		scanf("%d",&c[i]);
	for(register int i=1;i<=n;++i)
		scanf("%d",&d[i]);
	for(register int i=1;i<=n;++i)
		scanf("%lf",&k[i]);
	memset(map,0x3f,sizeof map);
	for(register int i=1;i<=e;++i)
	{
		int x,y,w;
		scanf("%d%d%d",&x,&y,&w);
		map[x][y]=min(map[x][y],w);
		map[y][x]=min(map[y][x],w);
	}
	for(register int k=1;k<=n;++k)
		for(register int i=1;i<=n;++i)
		{
			map[i][i]=0;
			for(register int j=1;j<=n;++j)
				map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
		}
	for(register int i=0;i<=n;++i)
		for(register int j=0;j<=m+1;++j)
			dp[i][j][0]=dp[i][j][1]=inf;
	dp[1][0][0]=0;
	for(register int i=1;i<=m+1;++i)
		dp[1][i][0]=dp[1][i][1]=0;
	for(register int i=2;i<=n;++i)
		for(register int j=0;j<=m;++j)
		{
			dp[i][j][0]=min(
			dp[i-1][j][0]+
			1.0*map[c[i-1]][c[i]],
			
			dp[i-1][j+1][1]+
			k[i-1]*map[d[i-1]][c[i]]+
			(1-k[i-1])*map[c[i-1]][c[i]]
			);
			if(j)
				dp[i][j][1]=min(
				dp[i-1][j][0]+
				k[i]*map[c[i-1]][d[i]]+
				(1-k[i])*map[c[i-1]][c[i]],
				
				dp[i-1][j+1][1]+
				k[i-1]*k[i]*map[d[i-1]][d[i]]+
				k[i-1]*(1-k[i])*map[d[i-1]][c[i]]+
				(1-k[i-1])*k[i]*map[c[i-1]][d[i]]+
				(1-k[i-1])*(1-k[i])*map[c[i-1]][c[i]]
				);
		}
	double ans=inf;
	for(register int i=0;i<=m;++i)
		ans=min3(ans,dp[n][i][0],dp[n][i][1]);
	printf("%.2lf",ans);
	return 0;
}
2024/6/21 15:29
加载中...