比赛 2017noip 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 换教室 最终得分 100
用户昵称 Regnig Etalsnart 运行时间 0.522 s
代码语言 C++ 内存使用 37.08 MiB
提交时间 2017-09-20 19:16:06
显示代码纯文本
#include<cstdio>
#include<iostream>
#define INF 1000000000
#define syy myson
using namespace std;
const int maxn=2001;
int n,m,v,e,c[maxn],d[maxn],dist[301][301],i,j;
double f[maxn][maxn][2],k[maxn],g[maxn],ans=INF;
int Main()
{
	freopen("classrooma.in","r",stdin);freopen("classrooma.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&v,&e);
	for(i=1;i<=n;i++)scanf("%d",&c[i]);
	for(i=1;i<=n;i++)scanf("%d",&d[i]);
	for(i=1;i<=n;i++)
	{
		scanf("%lf",&k[i]);
		g[i]=1-k[i];
	}
	for(i=1;i<=v;i++)for(j=1;j<=v;j++)dist[i][j]=INF;
	for(i=1;i<=v;i++)dist[i][i]=0;
	while(e--)
	{
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		if(w>=dist[a][b])continue;
		dist[a][b]=w;
		dist[b][a]=w;
	}
	for(int K=1;K<=v;K++)for(i=1;i<=v;i++)for(j=1;j<=v;j++)
		dist[i][j]=min(dist[i][j],dist[i][K]+dist[K][j]); 
	f[1][0][1]=INF;
	for(i=2;i<=n;i++)
	{
		f[i][0][0]=f[i-1][0][0]+dist[c[i-1]][c[i]];
		f[i][0][1]=INF;
		for(j=1;j<=m;j++)
		{
			f[i][j][0]=min(f[i-1][j][0]+dist[c[i-1]][c[i]],f[i-1][j][1]+k[i-1]*dist[d[i-1]][c[i]]+g[i-1]*dist[c[i-1]][c[i]]);
			f[i][j][1]=min(f[i-1][j-1][0]+k[i]*dist[c[i-1]][d[i]]+g[i]*dist[c[i-1]][c[i]],f[i-1][j-1][1]+k[i-1]*k[i]*dist[d[i-1]][d[i]]+k[i-1]*g[i]*dist[d[i-1]][c[i]]+g[i-1]*k[i]*dist[c[i-1]][d[i]]+g[i-1]*g[i]*dist[c[i-1]][c[i]]);
		}
	}
	for(i=0;i<=m;i++)
	{
		ans=min(ans,f[n][i][0]);
		ans=min(ans,f[n][i][1]);
	}
	printf("%.2lf\n",ans);
	return 0;
}
int main(){;}
int syy=Main();