BZOJ4720——[Noip2016]换教室

来源:互联网 发布:英雄联盟网吧特权软件 编辑:程序博客网 时间:2024/05/15 23:44

1、题意:给你一个无向图,你有一个序列a,长度定义为从序列的第一个点开始按照序列中的点一个一个的到达所需要的最短距离和。还有另外一个序列b,你可以用bi去代替ai,有ki的概率会代替成功,选择一些去代替,最多申请m个,求长度的最小期望值。
2、分析:神tm强行添加floyd..fi,j,k表示第i个点,已经选择要代替了j个点,i这个点是否代替的最小期望。转移就暴力的转移吧。。

#include <map>#include <set>#include <cmath>#include <queue>#include <vector>#include <bitset>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define M 1000010#define LL long long#define MOD 1000000007#define inf 1047483647#define llinf 4000000000000000000ll#define For(i, x, y) for(int i = (x); i < (y); i ++)#define rep(i, x, y) for(int i = (x); i <= (y); i ++)#define drep(i, x, y) for(int i = (x); i >= (y); i --)inline int read(){    char ch=getchar();int x=0,f=1;    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}inline LL llread(){    char ch=getchar();LL x=0,f=1;    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int a[2010][2]; double ki[2010][2];int dis[310][310];double f[2010][2010][2];int main(){    //freopen("classroom.in", "r", stdin);    //freopen("classroom.out", "w", stdout);    int n = read(), m = read(), v = read(), e = read();    rep(j, 0, 1) rep(i, 1, n) a[i][j] = read();    rep(i, 1, n) scanf("%lf", &ki[i][1]), ki[i][0] = 1.0 - ki[i][1];    rep(i, 1, v) rep(j, 1, v) if(i != j) dis[i][j] = inf;    while(e --){        int u = read(), v = read(), w = read();        dis[u][v] = dis[v][u] = min(dis[u][v], w);    }    rep(k, 1, v) rep(i, 1, v) rep(j, 1, v){        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);    }    rep(i, 0, n) rep(j, 0, n) rep(k, 0, 1) f[i][j][k] = 2047483647.0;    f[0][0][0] = 0;    rep(i, 1, n){        int upp = min(i, m);        rep(j, 0, upp){            int dis_00 = dis[a[i-1][0]][a[i][0]];            int dis_01 = dis[a[i-1][0]][a[i][1]];            int dis_10 = dis[a[i-1][1]][a[i][0]];            int dis_11 = dis[a[i-1][1]][a[i][1]];            double dtod = dis_00;            double dtoz = ki[i][1]*dis_01+ki[i][0]*dis_00;            double ztod = ki[i-1][1]*dis_10+ki[i-1][0]*dis_00;            double ztoz = ztod*ki[i][0]+(ki[i-1][1]*dis_11+ki[i-1][0]*dis_01)*ki[i][1];            f[i][j][0] = min(f[i-1][j][0]+dtod, f[i-1][j][1]+ztod);            if(j) f[i][j][1] = min(f[i-1][j-1][0]+dtoz, f[i-1][j-1][1]+ztoz);        }    }    double ans = 2047483647.0;    rep(j, 0, min(n, m)) rep(k, 0, 1){        ans = min(ans, f[n][j][k]);    //  printf("%.2lf\n", f[n][j][k]);    }    printf("%.2lf", ans);    return 0;}
0 0
原创粉丝点击