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
- hdu 5045 费用流
- hdu 5045 费用流
- hdu 5045 费用流
- HDU 5045 Contest(费用流)
- HDU 5045 Contest 费用流
- HDU 5045(Contest-费用流)[template:费用流]
- Arrest HDU 费用流
- hdu 3667 费用流
- HDU 3376 费用流
- hdu 1853 费用流
- HDU 1533 费用流
- hdu 4862 费用流
- hdu 4406 费用流
- HDU 4067 费用流
- HDU 3435 费用流
- HDU 5520 (费用流)
- hdu 5988 费用流
- HDU 5045 费用流求最大权
- java double 浮点数计算工具类 加减乘除和四舍五入
- 二 appium 篇
- mysql主从复制
- 关于extern和static关键字的全面总结
- activity属性设置大全
- hdu 5045 费用流
- iOS网络编程之Socket
- hadoop环境搭建之安装Ambari
- 关闭jvm占用端口
- Presents
- Access键盘快捷键大全(十一)
- 面试题六--XML部分
- MongoEngine对Django支持的官方文档翻译
- OneCoin(维卡币)卖币指南(Zz-Team)