题意:

  有n个区域和m条路,每个区域有a[i]个人和b[i]个食物,然后是m条路连接两个区域,这条路容量为cap,这条路断掉的概率为p,第一个经过的时候一定不会断,后面的人有概率p会断,现在需要所有人都吃上饭并且破坏网络的概率最小

解析:

  多源多汇,建一个超级源指向食物多的   超级汇指向人多的  概率为价值  板子里的价值都是加  所以化成log形式就好了 最后在化回来

求的是最小被破坏的概率,那么1 - 最大被破坏的概率就好了 费用流是价值最小  给价值加个符号 不就是最大了嘛

代码来自 :https://blog.csdn.net/Nemaleswang/article/details/77870967

改成了我喜欢写的形式,为什么不贴我的。。。。。emm。。。明明写的好看。。。为啥我的T

生活失去了希望

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
const int MaxEdge = ;
const double eps = 1e-;
int max_flow;
double value;
struct Edge{
int to,vol,next;
double cost;
}Node[MaxEdge]; int Pre[maxn],Path[maxn],Head[maxn],cnt, f[maxn];
double Dist[maxn];
bool vis[maxn]; void addedge(int u, int v, int vol, double cost){
Node[cnt].to = v;
Node[cnt].vol = vol;
Node[cnt].cost = cost;
Node[cnt].next = Head[u];
Head[u] = cnt++; Node[cnt].to = u;
Node[cnt].vol = ;
Node[cnt].cost = -cost;
Node[cnt].next = Head[v];
Head[v] = cnt++;
} bool Spfa(int s, int t){
for(int i = ;i < maxn;i++) Dist[i] = INF*1.0;
memset(Pre, -, sizeof(Pre));
memset(vis, false, sizeof(vis));
Dist[s] = 0.0;
queue<int>Q;
vis[s] = true;
Q.push(s);
f[s] = INF;
while (!Q.empty()){
int u = Q.front();
Q.pop();
vis[u] = false;
for (int e = Head[u]; e != -; e = Node[e].next){
int v = Node[e].to;
if (Node[e].vol > && Dist[v] - Dist[u] - Node[e].cost > eps){
Dist[v] = Dist[u] + Node[e].cost;
Pre[v] = u;
Path[v] = e;
f[Node[e].to] = min(f[u], Node[e].vol);
if(!vis[v]){
vis[v] = true;
Q.push(v);
}
}
}
}
if(Pre[t] == -) return ;
int u, v, e;
for(u = t; u != s; u = Pre[u]){
e = Path[u];
Node[e].vol -= f[t];
Node[e^].vol += f[t];
}
max_flow += f[t];
value += (double)f[t]*Dist[t];
return ;
} void MCMF(int s, int t)
{
max_flow = ;
value = ;
while(Spfa(s, t));
} void init(){
memset(Head,-,sizeof(Head));
cnt = ;
} int main(){
int t,n,m,a[maxn],b[maxn],c[maxn];
int u,v,cap;
double p;
scanf("%d",&t);
while(t--){
init();
scanf("%d%d",&n,&m);
for(int i = ;i <= n;i++){
scanf("%d%d",&a[i],&b[i]);
c[i] = a[i]-b[i];
}
while(m--){
scanf("%d%d%d%lf",&u,&v,&cap,&p);
p = -log2(1.0-p);
if(cap > ) addedge(u,v,,0.0);
if(cap- > ) addedge(u,v,cap-,p);
}
for(int i = ;i <= n;i++){
if(c[i] > ) addedge(,i,c[i],0.0);
else if(c[i] < ) addedge(i,n+,-c[i],0.0);
}
MCMF(,n+);
double ans = pow(,-value);
printf("%.2f\n",1.0-ans);
}
return ;
}

Coding Contest HDU - 5988(费用流)的更多相关文章

  1. HDU 5988 Coding Contest(浮点数费用流)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 题意:在acm比赛的时候有多个桌子,桌子与桌子之间都有线路相连,每个桌子上会有一些人和一些食物 ...

  2. Going Home HDU - 1533 费用流

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 给一个网格图,每两个点之间的匹配花费为其曼哈顿距离,问给每个的"$m$"匹配到一个&q ...

  3. hdu 5045 费用流

    滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...

  4. HDU 3376 费用流 Matrix Again

    题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在 ...

  5. hdu 2686 费用流 / 双线程DP

    题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1  费用流法:思路转化:从左 ...

  6. hdu 4406 费用流

    这题问题就是当前时刻究竟选择哪门课程,易知选择是和分数有关的,而且是一个变化的权值,所以能够用拆点的方式,把从基础分到100分都拆成点.但若这样拆点的话,跑费用流时就必须保证顺序.这样就麻烦了..观察 ...

  7. hdu 1853 (费用流 拆点)

    // 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...

  8. HDU 3667 费用流 拆边 Transportation

    题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...

  9. HDU 3667 费用流(拆边)

    题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...

随机推荐

  1. SkylineGlobe 从v6.1到v6.5 二次开发方面的变化参考

       2.1关于 TerraExplorer v6.5 API 除了一些新的功能,API v6.5不同于API v6.1的最大改进是其对象ID系统.虽然在以前版本的API中,有两个ID系统,一个用于对 ...

  2. 2-微信小程序开发(开发界面说明,按钮点击切换显示内容)

    说一个功能,大家在用微信实现控制设备的时候,是不是都在为绑定设备发愁. 我看了很多厂家的微信控制,大部分都只是可以用微信给设备配网,但是没有做用微信绑定的. 一般做绑定都是用设备的MAC地址. 这里我 ...

  3. HihoCoder1192 简单的树嵌入 dfs、构造

    题目传送门:http://hihocoder.com/problemset/problem/1192 大意:给出一棵$N$个点的树,边权为$1$,要求给每个点构造$M$个权值$v_1...v_M$,使 ...

  4. Redis对象占用内存分析

    当你往Redis中插入了一系统对象,如何分析这些对象的占用情况? 1.我们可以在Redis的控制台使用info命令来查看各项指标,其中有一项是Memory,可以通过存储前后的used_memory差异 ...

  5. CSS3选择器之:nth-child(n)

    第一次用到这个选择器还是为了解决下面了的问题: 手机的前端,我们使用了mint-ui,里面有一个日期选择控件,但是选择的时候没有提供年月的选择器,如: 而是提供了下面的方式: 为了达到上面的效果,使用 ...

  6. LOJ #6074. 「2017 山东一轮集训 Day6」子序列

    #6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...

  7. python第二周。2019.4.13

    1, 我绘制大蟒蛇就是..保存也对着呢,你要是打开文件的话,先闪个黑屏,再闪个白屏..自动退出,然后啥都没了. 我觉得是我代码编错了...再来一遍! 这次到可以,但是这个大蟒蛇好像没有回头... 刚才 ...

  8. Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇

    前面已经介绍了Jumpserver V3.0的安装,基于这篇安装文档,下面说下Jumpserver安装后的的功能使用: 一.jumpserver的启动 Jumpserver的启动和重启 [root@t ...

  9. 《Linux内核分析》第六周学习小结

    进程的描述和进程的创建 一.进程的描述 进程描述符task_struct数据结构: (1)操作系统的三大功能: 进程管理.内存管理.文件系统 (2)进程的作用: 将信号.进程间通信.内存管理和文件系统 ...

  10. 第三个sprint冲刺第三阶段

    公测版: