24pts,调不动了QAQ
查看原帖
24pts,调不动了QAQ
229446
ephemere楼主2020/10/7 20:20
#include<bits/stdc++.h>
using namespace std;

const int N=2005,M=305;

int n,m,v,e;
int a[N],b[N];
double ans=1e9,k[N],d[M][M],f[N][2];

int main()
{
	scanf("%d %d %d %d",&n,&m,&v,&e);
	
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=1;i<=n;++i) scanf("%d",&b[i]);
	for(int i=1;i<=n;++i) scanf("%lf",&k[i]);
	for(int i=1,u,v;i<=e;++i) scanf("%d %d %lf",&u,&v,&d[0][0]),d[u][v]=d[v][u]=d[0][0];
	
	for(int i=1;i<=v;++i)
	for(int j=1;j<=v;++j)
	for(int k=1;k<=v;++k)
	d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
	
	for(int j=0;j<=m;++j) f[j][0]=f[j][1]=1e9;
	
	f[0][0]=0;f[1][1]=0;
	
	for(int i=2;i<=n;++i)
	{
		double v00=d[a[i-1]][a[i]],v10=(1-k[i-1])*d[a[i-1]][a[i]]+k[i-1]*d[b[i-1]][a[i]];
		double v01=(1-k[i])*d[a[i-1]][a[i]]+k[i]*d[a[i-1]][b[i]],
			   v11=(1-k[i-1])*((1-k[i])*d[a[i-1]][a[i]]+k[i]*d[a[i]][b[i]])+k[i-1]*((1-k[i])*d[b[i-1]][a[i]]+k[i]*d[b[i-1]][b[i]]);
		for(int j=m;j;--j)
		f[j][0]=min(f[j][0]+v00,f[j][1]+v10),
		f[j][1]=min(f[j-1][0]+v01,f[j-1][1]+v11);
		
		f[0][0]=f[0][0]+v00;
	}
	
	for(int j=0;j<=m;++j) ans=min(ans,min(f[j][0],f[j][1]));
	printf("%.2lf",ans);
}
2020/10/7 20:20
加载中...