期望概率,式子毒瘤
要弗洛伊德初始化,有重边(最后才看到,调了好久
#include<iostream> #include<cstdio> #define ri register int #define u int namespace opt { inline u in() { u x(0),f(1); char s(getchar()); while(s<'0'||s>'9') { if(s=='-') f=-1; s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f; } } using opt::in; #define NN 90005 #include<cstring> namespace mainstay { u N,M,V,E,c[2005],d[2005],a[305][305]; double p[2005],f[2][90005][2]; inline void solve() { scanf("%d%d%d%d",&N,&M,&V,&E); for(ri i(1); i<=N; ++i) scanf("%d",&c[i]); for(ri i(1); i<=N; ++i) scanf("%d",&d[i]); for(ri i(1); i<=N; ++i) scanf("%lf",&p[i]); std::memset(a,0x3f,sizeof(a)); for(ri i(1); i<=E; ++i) { u _a,_b,_c; scanf("%d%d%d",&_a,&_b,&_c); a[_a][_b]=a[_b][_a]=std::min(a[_a][_b],_c); } for(ri i(1); i<=V; ++i) a[i][i]=0; for(ri t(1); t<=V; ++t) { for(ri i(1); i<=V; ++i) { for(ri j(1); j<=V; ++j) { a[i][j]=std::min(a[i][t]+a[t][j],a[i][j]); } } } for(ri i(0); i<=M; ++i) f[0][i][0]=f[0][i][1]=f[1][i][0]=f[1][i][1]=9999999999999.99; f[1][1][1]=f[1][0][0]=0; for(ri i(2); i<=N; ++i) { u now(i&1),pre(i&1^1); for(ri j(0); j<=M&&j<=i; ++j) { f[now][j][0]=std::min(f[pre][j][1]+p[i-1]*a[d[i-1]][c[i]]+(1-p[i-1])*a[c[i-1]][c[i]],f[pre][j][0]+a[c[i-1]][c[i]]); if(j-1>=0) f[now][j][1]=std::min(f[pre][j-1][1]+p[i]*p[i-1]*a[d[i-1]][d[i]]+p[i]*(1-p[i-1])*a[c[i-1]][d[i]]+(1-p[i])*p[i-1]*a[d[i-1]][c[i]]+(1-p[i])*(1-p[i-1])*a[c[i-1]][c[i]],f[pre][j-1][0]+p[i]*a[c[i-1]][d[i]]+(1-p[i])*a[c[i-1]][c[i]]); } } double ans(999999999999.99); for(ri i(0); i<=M; ++i) ans=std::min(ans,std::min(f[N&1][i][0],f[N&1][i][1])); printf("%.2f",ans); } } int main() { //freopen("x.txt","r",stdin); //freopen("my.txt","w",stdout); mainstay::solve(); }