80分孩子已经疯了求助
查看原帖
80分孩子已经疯了求助
133116
Xhesika_Frost楼主2021/11/13 09:55

嘿嘿,换教室,嘿嘿和??


#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;
}
2021/11/13 09:55
加载中...