40pts求助,玄关
查看原帖
40pts求助,玄关
95170
Tune_楼主2023/8/22 17:42
#include<bits/stdc++.h>
using namespace std;
int n,m,v,e,c[2005],d[2005];
double f[2005][2005][1],dis[2005][20065],p[2005];
int main()
{
	scanf("%d%d%d%d",&n,&m,&v,&e);
	for(int i=1;i<=n;i++)
		scanf("%d",&c[i]);
	for(int i=1;i<=n;i++)
		scanf("%d",&d[i]);
	for(int i=1;i<=n;i++)
		scanf("%lf",&p[i]);
	for(int i=1;i<=v;i++)
    for(int j=1;j<i;j++)
    	dis[i][j]=dis[j][i]=999999999;
    for(int i=1;i<=n;i++)
    for(int j=0;j<=m;j++)
    	f[i][j][0]=f[i][j][1]=999999999;
	for(int i=1;i<=e;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		dis[u][v]=dis[v][u]=min(dis[v][u],1.0*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[k][j]+dis[i][k],dis[i][j]);
	f[1][0][0]=f[1][1][1]=0;
	for(int i=2;i<=n;i++)
	{
		double add=dis[c[i-1]][c[i]];
		for(int j=0;j<=min(m,i);j++)
		{
			f[i][j][0]=min(f[i-1][j][0]+add,f[i-1][j][1]+dis[d[i-1]][c[i]]*p[i-1]+dis[c[i-1]][c[i]]*(1-p[i-1]));
			if(j!=0)
				f[i][j][1]=min(f[i-1][j-1][0]+dis[c[i-1]][d[i]]*p[i]+dis[c[i-1]][c[i]]*(1-p[i]),f[i-1][j-1][1]+dis[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])+dis[c[i-1]][d[i]]*(1-p[i-1])*p[i]+dis[d[i-1]][c[i]]*(1-p[i])*p[i-1]+dis[d[i-1]][d[i]]*p[i-1]*p[i]);
		}
	}
	double ans=999999999;
	for(int i=0;i<=m;i++)
		ans=min(ans,min(f[n][i][0],f[n][i][1]));
	printf("%.2lf",ans);
}	
2023/8/22 17:42
加载中...