1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std;
typedef long long LL;
const int maxn=2005, maxv=305; const LL inf=1e11;
int n,m,v,e,rm[maxn][2]; double k[maxn];
int dis[maxv][maxv]; void Floyd() { fo(k,1,v) fo(i,1,v) if (i!=k && dis[i][k]<dis[0][0]) fo(j,1,v) if (j!=i && j!=k && dis[k][j]<dis[0][0] && dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; }
double Min(double x,double y) { if (x>inf && y>inf) return inf; if (x>inf) return y; if (y>inf) return x; if (x<y) return x; else return y; }
double f[maxn][maxn][2]; int main() { freopen("classroom.in","r",stdin); freopen("classroom.out","w",stdout); scanf("%d %d %d %d",&n,&m,&v,&e); fo(i,1,n) scanf("%d",&rm[i][0]); fo(i,1,n) scanf("%d",&rm[i][1]); fo(i,1,n) scanf("%lf",&k[i]); memset(dis,127,sizeof(dis)); fo(i,1,e) { int x,y,w; scanf("%d %d %d",&x,&y,&w); dis[x][y]=min(dis[x][y],w); dis[y][x]=min(dis[y][x],w); } fo(i,1,v) dis[i][i]=0; Floyd(); fo(i,1,n) fo(j,0,m) fo(c,0,1) f[i][j][c]=inf; f[1][0][0]=f[1][1][1]=0; fo(i,2,n) fo(j,0,m) fo(c,0,1) { double t=k[i-1]*dis[rm[i-1][1]][rm[i][0]]+(1-k[i-1])*dis[rm[i-1][0]][rm[i][0]]; f[i][j][0]=Min(f[i-1][j][0]+dis[rm[i-1][0]][rm[i][0]],f[i-1][j][1]+t); if (j) { double t1=k[i]*dis[rm[i-1][0]][rm[i][1]]+(1-k[i])*dis[rm[i-1][0]][rm[i][0]]; t=k[i-1]*k[i]*dis[rm[i-1][1]][rm[i][1]]+(1-k[i-1])*k[i]*dis[rm[i-1][0]][rm[i][1]]; t+=k[i-1]*(1-k[i])*dis[rm[i-1][1]][rm[i][0]]+(1-k[i-1])*(1-k[i])*dis[rm[i-1][0]][rm[i][0]]; f[i][j][1]=Min(f[i-1][j-1][0]+t1,f[i-1][j-1][1]+t); } } double ans=inf; fo(j,0,m) ans=min(ans,Min(f[n][j][0],f[n][j][1])); printf("%.2f\n",ans); }
|