嘿嘿,换教室,嘿嘿和??
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
template<class T>
void read(T &now){
now=0;
char c=getchar();
int f=1;
while((!isdigit(c))){
if(c=='-') f=-1;
// cout<<isdigit(c)<<" "<<c<<" ";
c=getchar();
}
while(isdigit(c)){
now=(now<<1)+(now<<3)+c-'0';
c=getchar();
}
now*=f;
}
int n,m,v,e;
double dis[400][400];
int x,y;
double z;
double k[4000];
int c[4000];
double ans=1e10;
int d[4000];
double f[2005][2005][2];
int main(){
read(n);read(m);read(v);read(e);
for(int i=1;i<=n;++i){
read(c[i]);
}
for(int j=1;j<=n;++j){
read(d[j]);
}
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]=1e17;
}
}
for(int i=1;i<=e;++i){
read(x);read(y);cin>>z;
dis[x][y]=dis[y][x]=min(dis[x][y],z);
}
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[i][j],dis[i][k]+dis[k][j]);
}
}
}
for(int i=1;i<=v;++i){
dis[i][i]=dis[i][0]=dis[0][i]=0;
}
for(int i=0;i<=n;++i){
for(int j=0;j<=m;++j){
f[i][j][0]=1e18;
f[i][j][1]=1e18;;
}
}
f[1][0][0]=0;
f[1][1][1]=0;
for(int i=2;i<=n;++i){
f[i][0][0]=f[i-1][0][0]+dis[c[i-1]][c[i]];
for(int j=1;j<=min(i,m);++j){
f[i][j][0]=min(f[i-1][j][0]+dis[c[i-1]][c[i]],f[i-1][j][1]+k[i-1]*dis[d[i-1]][c[i]]+(1-k[i-1])*dis[c[i-1]][c[i]]);;
f[i][j][1]=min(f[i-1][j-1][0]+dis[c[i-1]][c[i]]*(1-k[i])+dis[c[i-1]][d[i]]*k[i],
f[i-1][j-1][1]+k[i-1]*k[i]*dis[d[i-1]][d[i]]+(1-k[i-1])*k[i]*dis[c[i-1]][d[i]]+k[i-1]*(1-k[i])*dis[d[i-1]][c[i]]+
dis[d[i-1]][d[i]]*(1-k[i-1])*(1-k[i])
);
}
}
ans=1e17;
for(int i=0;i<=m;++i){
ans=min(ans,min(f[n][i][0],f[n][i][1]));
}
printf("%.2lf",ans);;
return 0;
}