hdu 5988 Coding Contest 费用流
来源:互联网 发布:php人力资源管理系统 编辑:程序博客网 时间:2024/05/18 22:39
题目:
http://acm.split.hdu.edu.cn/showproblem.php?pid=5988
题意:
有n个区域,有m条有向边连接它们,每条边都有一个被破环的几率,但第一个人通过不会造成任何影响,之后的人通过才会有影响。现在每个区域内有一定的队员和背包,要求每个队员都拿到一个背包,且使道路奔溃的几率最小,求这个最小几率
思路:
被破坏的几率最小就是不被破坏的几率最大。可以用费用流去做,因为是乘法,那么先取log再去跑费用流,再对结果去exp即可
#include <bits/stdc++.h>using namespace std;const int N = 100 + 10, INF = 0x3f3f3f3f;const double eps = 1e-8;struct edge{ int to, cap, next; double cost;} g[N*N*10];int cnt, head[N];int pre[N];double dis[N];bool vis[N];int nv;void init(){ cnt = 0; memset(head, -1, sizeof head);}void add_edge(int v, int u, int cap, double cost){ g[cnt].to = u, g[cnt].cap = cap, g[cnt].cost = cost, g[cnt].next = head[v], head[v] = cnt++; g[cnt].to = v, g[cnt].cap = 0, g[cnt].cost = -cost, g[cnt].next = head[u], head[u] = cnt++;}bool spfa(int s, int t){ for(int i = 0; i < nv; i++) dis[i] = INF; memset(vis, 0, sizeof vis); memset(pre, -1, sizeof pre); queue<int> que; que.push(s); dis[s] = 0.0, vis[s] = true; while(! que.empty()) { int v = que.front(); que.pop(); vis[v] = false; for(int i = head[v]; i != -1; i = g[i].next) { int u = g[i].to; if(g[i].cap > 0 && dis[u] - dis[v] - g[i].cost > eps)//这里不取eps会tle { dis[u] = dis[v] + g[i].cost; pre[u] = i; if(! vis[u]) que.push(u), vis[u] = true; } } } return !(abs(dis[t] - INF) < eps);}double cost_flow(int s, int t, int flow){ double ans = 0; while(flow > 0) { if(! spfa(s, t)) return -1; int d = INF; for(int i = pre[t]; i != -1; i = pre[g[i^1].to]) d = min(d, g[i].cap); for(int i = pre[t]; i != -1; i = pre[g[i^1].to]) g[i].cap -= d, g[i^1].cap += d; ans += d * dis[t]; flow -= d; } return ans;}int main(){ int t, n, m; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); init(); int ss = 0, tt = n + 1; int a, b, c; double p; int sum = 0; for(int i = 1; i <= n; i++) { scanf("%d%d", &a, &b); if(a - b > 0) add_edge(ss, i, a-b, 0), sum += a-b; if(a - b < 0) add_edge(i, tt, -(a-b), 0); } for(int i = 1; i <= m; i++) { scanf("%d%d%d%lf", &a, &b, &c, &p); if(c >= 1) add_edge(a, b, 1, 0); if(c > 1) add_edge(a, b, c-1, -log(1-p)); } nv = tt + 1; double ans = cost_flow(ss, tt, sum); printf("%.2f\n", 1.0 - exp(-ans)); } return 0;}
阅读全文
0 0
- hdu 5988 Coding Contest (费用流)
- HDU 5988 Coding Contest(费用流)
- 【HDU 5988】 Coding Contest 【费用流】
- HDU-5988-Coding Contest(费用流)
- hdu 5988 Coding Contest (最小费用流)
- HDU-5988 Coding Contest 最大费用流
- hdu 5988 Coding Contest 费用流
- HDU 5988 Coding Contest(费用流)
- HDU 5988 Coding Contest(最小费用最大流)
- [最大费用最大流]HDU 5988 Coding Contest
- hdu 5988 Coding Contest(最小费用流 骚)
- HDU 5988 Coding Contest (最小费用流)
- hdu 5988 Coding Contest (费用流变形)
- HDU 5988 Coding Contest 最小费用流变形
- hdu 5988 Coding Contest 青岛G题 费用流以及一些感想吧
- HDU 5988 Coding Contest 2016青岛G题浮点费用流
- HDU-5988 Coding Contest
- HDU 5045 Contest(费用流)
- java客户端连接kafka简单测试
- 伪数组排序(例:li标签)
- 缓存更新的套路
- java中的UDP和TCP
- xfire webService发布以及客户端调用(带验证头)
- hdu 5988 Coding Contest 费用流
- Prim算法
- 神经机器翻译(Neural Machine Translation)系列教程
- http协议
- Linux Unit3--管理输入输出
- STL 模板库中迭代器 iterator 失效问题
- Android旧版本NDK的下载
- linux下各文件夹的结构说明及用途介绍
- 【POJ/BZOJ】3254/1725 Corn Fields 状压DP