https://www.luogu.org/problem/P1850
题解 https://www.luogu.org/problemnew/solution/P1850
我居然连folyd都不会了。。。。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=2005; const double inf=1047483647.00; 6 int n,m,v,e,c[N],d[N]; 7 double p[N],f[N][N][2]; 8 int a[305][305]; 9 int main() 10 { 11 scanf("%d%d%d%d",&n,&m,&v,&e); 12 for(int i=1;i<=n;i++) scanf("%d",&c[i]); 13 for(int i=1;i<=n;i++) scanf("%d",&d[i]); 14 for(int i=1;i<=n;i++) scanf("%lf",&p[i]); 15 16 memset(a,0x3f,sizeof(a)); 17 int x,y,z; 18 for(int i=1;i<=e;i++) 19 {scanf("%d%d%d",&x,&y,&z); a[x][y]=a[y][x]=min(a[x][y],z); } 20 for(int i=1;i<=v;i++) a[i][i]=0; 21 22 for(int k=1;k<=v;k++) 23 for(int i=1;i<=v;i++) 24 for(int j=1;j<=v;j++) a[i][j]=min(a[i][k]+a[k][j],a[i][j]); 25 26 for(int i=1;i<=n;i++) 27 for(int j=0;j<=m;j++) f[i][j][0]=f[i][j][1]=inf; 28 29 f[1][0][0]=f[1][1][1]=0; 30 for(int i=2;i<=n;i++) 31 for(int j=0;j<=min(i,m);j++) 32 { f[i][j][0]=min(f[i-1][j][0]+a[c[i-1]][c[i]], f[i-1][j][1]+p[i-1]*a[d[i-1]][c[i]]+(1-p[i-1])*a[c[i-1]][c[i]]); 33 34 if(j>0) f[i][j][1]=min(f[i-1][j-1][0]+p[i]*a[c[i-1]][d[i]]+(1-p[i])*a[c[i-1]][c[i]], 35 f[i-1][j-1][1]+p[i-1]*p[i] * a[d[i-1]][d[i]] 36 +(1-p[i-1])*p[i] * a[c[i-1]][d[i]] 37 +p[i-1]*(1-p[i]) * a[d[i-1]][c[i]] 38 +(1-p[i-1])*(1-p[i]) * a[c[i-1]][c[i]] 39 ); 40 } 41 42 double ans=inf; 43 for(int j=0;j<=min(n,m);j++) ans=min(ans,min(f[n][j][0],f[n][j][1])); 44 printf("%.2f",ans); 45 return 0; 46 }