比赛 2017noip 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 换教室 最终得分 100
用户昵称 pb0207 运行时间 1.010 s
代码语言 C++ 内存使用 68.85 MiB
提交时间 2017-09-21 07:53:46
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=3e2+1e1+7,M=2e3+1e2+7;

double dis[N][N];

double f[M][M][2];

int n,m,v,e,c[M],d[M];

double k[M];

int main()
{
	freopen("classrooma.in","r",stdin);
	freopen("classrooma.out","w",stdout);
	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",&k[i]);
	for(int i=1;i<=v;i++)
		for(int j=1;j<=v;j++)
			dis[i][j]=2e8;
	for(int i=1;i<=v;i++)
		dis[i][i]=0.0;
	for(int i=1;i<=e;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		dis[u][v]=min(dis[u][v],(double)w);
		dis[v][u]=min(dis[v][u],(double)w);
	}
	for(int q=1;q<=v;q++)
		for(int i=1;i<=v;i++)
			for(int j=1;j<=v;j++)
				dis[i][j]=min(dis[i][j],dis[i][q]+dis[q][j]);
	for(int i=0;i<=n;i++)
		for(int t=0;t<=m;t++)
			for(int j=0;j<2;j++)
				f[i][t][j]=2e9;
	f[1][0][0]=f[1][1][1]=0;
	for(int i=2;i<=n;i++)
	for(int j=0;j<=min(i,m);j++)
	{
		f[i][j][0]=f[i-1][j][0]+dis[c[i-1]][c[i]];
		f[i][j][0]=min(f[i][j][0],f[i-1][j][1]+k[i-1]*dis[d[i-1]][c[i]]+(1.0-k[i-1])*dis[c[i-1]][c[i]]);
		if(j>=1)
		{
			f[i][j][1]=f[i-1][j-1][0]+k[i]*dis[c[i-1]][d[i]]+(1.0-k[i])*dis[c[i-1]][c[i]];
			f[i][j][1]=min(f[i][j][1],f[i-1][j-1][1]+k[i-1]*(k[i]*dis[d[i-1]][d[i]]+(1.0-k[i])*dis[d[i-1]][c[i]])+
											(1.0-k[i-1])*(k[i]*dis[c[i-1]][d[i]]+(1.0-k[i])*dis[c[i-1]][c[i]]));
		}
	}
	double ans=2e8;
	for(int i=1;i<=min(n,m);i++)
	{
		ans=min(ans,f[n][i][0]);
		ans=min(ans,f[n][i][1]);
	}
	ans=min(ans,f[n][0][0]);
	printf("%.2lf",ans);
}