hdu 5045 费用流

来源:互联网 发布:p2p远程监控软件 编辑:程序博客网 时间:2024/04/29 14:00

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5045


题意:n个选手 m个题目。。每次必须所有人都做了题目才能再做题目,举个栗子,不能一个人一直做。。必须均摊开来做。。

给你每个人过mi个题目的概率,问你最大ac题目的期望是多少。


思路:其实n等于10,dp就可以了,每轮次dp出来全部人安排好了的最佳情况。。转移方程也很简单,枚举邻接状态的最优解就可以了。

这里考虑费用流的做法,也比较明显,就是一个分配任务指派问题,所以跑上m/n次费用流就可以了。。。讲道理是比状压复杂度要好的。。


代码:

#include <bits/stdc++.h>#define bug(x) cout<<" x "<<x<<endl;using namespace std;const int MAXN = 105;const int MAXM = 105;const int INF = 0x3f3f3f3f;struct Edge{    int to,next,cap,flow;    double cost;} edge[MAXM];int head[MAXN],tol;int pre[MAXN];double dis[MAXN];bool vis[MAXN];int N;//节点总个数,节点编号从0~N-1void init(int n){    N = n;    tol = 0;    memset(head,-1,sizeof(head));}void addedge(int u,int v,int cap,double cost){    edge[tol].to = v;    edge[tol].cap = cap;    edge[tol].cost = cost;    edge[tol].flow = 0;    edge[tol].next = head[u];    head[u] = tol++;    edge[tol].to = u;    edge[tol].cap = 0;    edge[tol].cost = -cost;    edge[tol].flow = 0;    edge[tol].next = head[v];    head[v] = tol++;}bool spfa(int s,int t){    queue<int>q;    for(int i = 0; i < N; i++){        dis[i] = INF;        vis[i] = false;        pre[i] = -1;    }    dis[s] = 0;    vis[s] = true;    q.push(s);    while(!q.empty()){        int u = q.front();        q.pop();        vis[u] = false;        for(int i = head[u]; i != -1; i = edge[i].next){            int v = edge[i].to;            if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost ){                dis[v] = dis[u] + edge[i].cost;                    //返回的是最大流,cost存的是最小费用                pre[v] = i;                if(!vis[v])                {                    vis[v] = true;                    q.push(v);                }            }        }    }    if(pre[t] == -1)return false;    else return true;}int minCostMaxflow(int s,int t,double &cost){    int flow = 0;    cost = 0;    while(spfa(s,t)){        int Min = INF;        for(int i = pre[t]; i != -1; i = pre[edge[i^1].to]){            if(Min > edge[i].cap - edge[i].flow)                Min = edge[i].cap - edge[i].flow;        }        for(int i = pre[t]; i != -1; i = pre[edge[i^1].to]){            edge[i].flow += Min;            edge[i^1].flow -= Min;            cost += edge[i].cost * Min;        }        flow += Min;    }    return flow;}int n,m;double arr[20][1050];int main(){    int t,cas=1;    scanf("%d",&t);    while(t--){        int l, r;        scanf("%d%d",&n,&m);        double ret=0;        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                scanf("%lf",&arr[i][j]);            }        }        for(int i=0;i<m;i+=n){            init(n+n+5);            for(int k=0;k<n;k++) addedge(0,k+1,1,0);            for(int k=0;k<n;k++) addedge(n+k+1,n+n+1,1,0);            for(int j=0;j<n;j++){                for(int k=0;k<n&&i+k<m;k++){                    addedge(j+1,n+k+1,1,-arr[j][i+k]);                }            }            double tmp=0.0;            minCostMaxflow(0,n+n+1,tmp);            ret+=tmp;        }        printf("Case #%d: %.5f\n",cas++,-ret);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为麦芒5的开关键失灵怎么办 小米手机进水黑屏但是有声音怎么办 小米5手机突然黑屏没电怎么办 小米4开不了机怎么办充电没反应 小米手机充电没反应开不了机怎么办 红米note手机开不了机怎么办 红米手机突然黑屏开不了机怎么办 红米2a开不开机怎么办 红米4手开不了机怎么办 红米4a开不了机怎么办 魅族手机拨打电话时黑屏怎么办 金立手机拨打电话时黑屏怎么办 红米手机刷机黑屏了怎么办 酷派手机开机黑屏但能嗡嗡响怎么办 酷派手机忘记锁屏密码怎么办 酷派手机锁屏密码忘了怎么办 酷派手机不停的开机关机怎么办 苹果6手机进水了开不了机怎么办 金立手机突然黑屏开不了机怎么办 丢失手机又忘了ID锁怎么办? 小米2按出电话后黑屏怎么办 华为手机桌面拨号键没有了怎么办 华为荣耀5x黑屏后无法关机怎么办 华为手机突然黑屏电池充不了怎么办 华为手机恢复出厂设置后黑屏怎么办 华为荣耀畅玩6a内存不够怎么办 红米note4玩王者荣耀卡怎么办 华为荣耀5a手机被锁怎么办 华为荣耀v8应用锁忘记蜜码怎么办 阿里巴巴一键代销被投诉受假怎么办 登录小米云服务怎么删除密码怎么办 苹果6云空间连接不上怎么办 买家收到淘宝网交易异常通知怎么办 快递把我秒杀的货弄丢了怎么办 手机淘宝退货物流单号填错了怎么办 买家要求退货退款但是不发货怎么办 多给买家寄包裹不接电话怎么办 给买家发货物流单号错了怎么办 淘宝退货退款快递单号填错了怎么办 淘宝不小心点了延迟收货怎么办 淘宝快递地址错了货已经发了怎么办