我裂开来
查看原帖
我裂开来
138357
Richard21477楼主2020/9/25 22:26
#include<bits/stdc++.h>
using namespace std;
double min(double a,double b){
	return (a>=b)?b:a;
}
const double up=1000000000;
int main(){
	int n,m,v,e;
	cin>>n>>m>>v>>e;
	int c[n],d[n];
	double k[n];
	for (int i=0;i<n;i++){
		scanf("%d",&c[i]);
	}
	for (int i=0;i<n;i++){
		scanf("%d",&d[i]);
	}
	for (int i=0;i<n;i++){
		scanf("%lf",&k[i]);
	}
	double floyd[v+1][v+1];
	for (int i=1;i<=v;i++)
		for (int j=1;j<=v;j++)
			floyd[i][j]=(i==j)?0:up;
	for (int i=0;i<e;i++){
		int a,b;
		double w;
		scanf("%d%d%lf",&a,&b,&w);
		floyd[a][b]=floyd[b][a]=w;
	}
	//cout<<up<<endl;
	for (int j=1;j<=v;j++)
		for (int i=1;i<=v;i++)
			for (int k=1;k<=v;k++)
				floyd[i][k]=min(floyd[i][k],floyd[i][j]+floyd[j][k]);
	//for (int i=1;i<=v;i++)
	//	for (int j=1;j<=v;j++)
	//		cout<<i<<" "<<j<<" "<<floyd[i][j]<<endl;
	double dp[2][m+2][2];
	for (int i=0;i<=m;i++)
		dp[0][i][1]=dp[0][i][0]=up;
	dp[0][0][0]=dp[0][1][1]=0;
	for (int i=1;i<n;i++){
		for (int j=0;j<=m;j++){
			int st1=c[i-1],st2=d[i-1],ed1=c[i],ed2=d[i];
			double stk_yes=k[i-1],stk_no=1-k[i-1],edk_yes=k[i],edk_no=1-k[i];
			double l11=floyd[st1][ed1];
			double l12=floyd[st1][ed2];
			double l21=floyd[st2][ed1];
			double l22=floyd[st2][ed2];
			//不申请
			double key1=dp[0][j][0]+l11;
			dp[1][j][0]=key1;
			if (j>0){
				double key2=dp[0][j][1]+stk_yes*l21+stk_no*l11;
				dp[1][j][0]=min(dp[1][j][0],key2);
				double key3=dp[0][j-1][0]+edk_yes*l12+edk_no*l11;
				dp[1][j][1]=key3;
				if (j>1){
					double key4=dp[0][j-1][1];
					key4+=stk_yes*edk_yes*l22;
					key4+=stk_yes*edk_no*l21;
					key4+=stk_no*edk_yes*l12;
					key4+=stk_no*edk_no*l11;
					dp[1][j][1]=min(dp[1][j][1],key4);
				}
				/*dp[1][j][0]=min(dp[1][j][0],dp[0][j-1][1]+k[i]*(floyd[c[i-1]][c[i]])+(1-k[i])*(floyd[d[i-1]][c[i]]));
				//申请
				dp[1][j][1]=min(dp[0][j-1][0]+(1-k[i])*floyd[c[i-1]][c[i]]+k[i]*floyd[c[i-1]][d[i]],
								dp[0][j-1][1]+k[i-1]*k[i]*floyd[d[i-1]][d[i]]+k[i-1]*(1-k[i])*floyd[d[i-1]][c[i]]
											+(1-k[i-1])*k[i]*floyd[c[i-1]][d[i]]+(1-k[i-1])*(1-k[i])*floyd[c[i-1]][c[i]]);
				*/
			}
			else{
				dp[1][j][1]=up;
			}
		}
		for (int j=0;j<=m;j++){
			dp[0][j][0]=dp[1][j][0];
			dp[0][j][1]=dp[1][j][1];
		}
	}
	double ans=up;
	for (int i=0;i<=m;i++){
		ans=min(ans,dp[0][i][0]);
		ans=min(ans,dp[0][i][1]);
	}
	printf("%0.2f\n",ans);
	return 0;
} 
2020/9/25 22:26
加载中...