遇到的问题:
- 惊奇发现floyd不会写了,于是复制5遍水一下
- 就是不知道的错了,求条QWQ
#include<bits/stdc++.h>
using namespace std;
#define db double
const int maxn=2e3+10;
int n,m,v,e,c[maxn+10],w[maxn+10][maxn+10],d[maxn+10];
db k[maxn+10],f[maxn+10][maxn+10][2];
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m>>v>>e;
for(int i=1;i<=n;++i)cin>>c[i];
for(int i=1;i<=n;++i)cin>>d[i];
for(int i=1;i<=n;++i)cin>>k[i];
memset(w,0x3f,sizeof w);
for(int i=1;i<=n;++i)w[i][i]=0;
for(int i=1,a,b,W;i<=e;++i){
cin>>a>>b>>W;
w[a][b]=w[b][a]=min(W,w[a][b]);
}
for(int x=1;x<=v;++x){
for(int y=1;y<=v;++y){
for(int o=1;o<=v;++o){
if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
}
}
}
for(int x=1;x<=v;++x){
for(int y=1;y<=v;++y){
for(int o=1;o<=v;++o){
if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
}
}
}
for(int x=1;x<=v;++x){
for(int y=1;y<=v;++y){
for(int o=1;o<=v;++o){
if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
}
}
}
for(int x=1;x<=v;++x){
for(int y=1;y<=v;++y){
for(int o=1;o<=v;++o){
if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
}
}
}
for(int x=1;x<=v;++x){
for(int y=1;y<=v;++y){
for(int o=1;o<=v;++o){
if(w[x][o]+w[o][y]<w[x][y])w[x][y]=w[x][o]+w[o][y];
}
}
}
for (int i = 1; i <= n; i++)
for (int j = 0; j <= min(m,i); j++) f[i][j][0] = f[i][j][1] = 1e9;
f[1][0][0] = f[1][1][1] = 0;
for(int i=2;i<=n;++i){
for(int j=0;j<=min(m,i);++j){
f[i][j][0]=min(f[i-1][j][1]+(db)w[d[i-1]][c[i]]*k[i-1]+(db)w[c[i-1]][c[i]]*(1-k[i-1]),
f[i-1][j][0]+(db)w[c[i-1]][c[i]]);
if(j)f[i][j][1]=min(f[i-1][j-1][0]+(db)w[c[i-1]][d[i]]*k[i]+(db)w[c[i-1]][c[i]]*(1-k[i]),
f[i-1][j-1][1]+(db)w[c[i-1]][d[i]]*(1-k[i-1])*k[i]+
(db)w[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])+
(db)w[d[i-1]][d[i]]*k[i-1]*k[i]+
(db)w[d[i-1]][c[i]]*k[i-1]*(1-k[i]));
}
}
db ans=(db)INT_MAX;
for(int i=0;i<=m;++i)ans=min({ans,f[n][i][0],f[n][i][1]});
cout << fixed << setprecision(2) << ans;
return 0;
}