记录编号 357893 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2016]换教室 最终得分 100
用户昵称 GravatarShirry 是否通过 通过
代码语言 C++ 运行时间 0.655 s
提交时间 2016-12-13 13:20:13 内存使用 62.92 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#define INF 9999999
using namespace std;
int n,m,v,e;
int c[2010]={0},d[2010]={0},A[500][500]={0};
double k[2010]={0},F[2010][2010][2]={0};
void Floyd(){
	for(int k=1;k<=v;k++){
		for(int u=1;u<=v;u++){
			for(int q=1;q<=v;q++){
					if(A[u][q]>A[u][k]+A[k][q])
						A[u][q]=A[u][k]+A[k][q];
			}
		}
	}
}
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]);//噢卧槽,读入是"%lf",简直太蠢……
	for(int i=1;i<=v;i++){
		for(int j=1;j<=v;j++)
			A[i][j]=INF;
		A[i][i]=0;
	}
	for(int i=1;i<=e;i++){
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		A[a][b]=min(w,A[a][b]);
		A[b][a]=min(w,A[b][a]);
	}
	Floyd();
	double ans=0;
	F[1][0][1]=INF;
	for(int i=2;i<=n;i++){
		for(int j=1;j<=m;j++){
			double qwq=F[i-1][j][0]+A[c[i-1]][c[i]];
			double qaq=F[i-1][j][1]
			+(k[i-1]*A[d[i-1]][c[i]])
			+((1-k[i-1])*A[c[i-1]][c[i]]);
			F[i][j][0]=min(qwq,qaq);
			double abc=F[i-1][j-1][0]
				+(k[i]*A[c[i-1]][d[i]])
				+((1-k[i])*A[c[i-1]][c[i]]);
			double edf=F[i-1][j-1][1]
				+(k[i]*k[i-1]*A[d[i]][d[i-1]])
				+((1-k[i-1])*k[i]*A[c[i-1]][d[i]])
				+((1-k[i])*k[i-1]*A[d[i-1]][c[i]])
				+((1-k[i])*(1-k[i-1])*A[c[i-1]][c[i]]);
			F[i][j][1]=min(abc,edf);
		}
		F[i][0][0]=F[i-1][0][0]+A[c[i-1]][c[i]];
		F[i][0][1]=INF;
	}
	ans=min(F[n][m][0],F[n][m][1]);
	printf("%.2lf\n",ans);
	return 0;//DP大法好
}