题目:https://vjudge.net/contest/412116#problem/G

题意:t组样例,n个点,每个点有sis_isi​个人和bib_ibi​份物资。m条边,每条边从第二次开始,每被经过一次,断掉的概率为pip_ipi​,并且被经过的上限为cic_ici​,超过cic_ici​则一定会断掉。现在每个人都要获得一份物资,问 路会断掉的最小可能性是多少。

思路

  • 路会断掉的可能性为P=1−∏i=1n(1−pi)kP=1-\prod_{i=1}^{n}(1-p_i)^kP=1−∏i=1n​(1−pi​)k
  • 考虑如何计算∏i=1n(1−pi)k\prod_{i=1}^{n}(1-p_i)^k∏i=1n​(1−pi​)k,显然这是个费用流问题
    • 每k个单位流过一条边的贡献为(1−pi)k(1-p_i)^k(1−pi​)k,我们进行取对数操作log[(1−p1)k1∗(1−p2)k2∗⋅⋅⋅∗(1−pn)kn]=k1log(1−p1)+k2log(1−p2)+⋅⋅⋅+knlog(1−pn)log[(1-p_1)^{k_1}*(1-p_2)^{k_2}*···*(1-p_n)^{k_n}]=k_1log(1-p_1)+k_2log(1-p_2)+···+k_nlog(1-p_n)log[(1−p1​)k1​∗(1−p2​)k2​∗⋅⋅⋅∗(1−pn​)kn​]=k1​log(1−p1​)+k2​log(1−p2​)+⋅⋅⋅+kn​log(1−pn​)然后就可以进行费用流的操作了,考虑费用是正数,所以将log(1−pi)log(1-p_i)log(1−pi​)取负。因为k1log(1−p1)+k2log(1−p2)+⋅⋅⋅+knlog(1−pn)k_1log(1-p_1)+k_2log(1-p_2)+···+k_nlog(1-p_n)k1​log(1−p1​)+k2​log(1−p2​)+⋅⋅⋅+kn​log(1−pn​)越大越好,所以k1[−log(1−p1)]+k2[−log(1−p2)]+⋅⋅⋅+kn[−log(1−pn)]k_1[-log(1-p_1)]+k_2[-log(1-p_2)]+···+k_n[-log(1-p_n)]k1​[−log(1−p1​)]+k2​[−log(1−p2​)]+⋅⋅⋅+kn​[−log(1−pn​)]越小越好,边的费用为−log(1−pi)-log(1-p_i)−log(1−pi​),就是最小费用最大流
    • 如果si>bis_i>b_isi​>bi​,显然要流出,从源点向该点连边,流量上限为si−bis_i-b_isi​−bi​,费用为0
    • 如果si<bis_i<b_isi​<bi​,从该点向汇点连边,流量上限为bi−sib_i-s_ibi​−si​,费用为0
    • 考虑第一次不会有断掉的可能性,我们把一条边拆成两条边,一条流量上限为111,费用为0,一条费用为−log(1−pi)-log(1-p_i)−log(1−pi​)

代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<double,int>P;
const double inf=1000000000.0;
const double eps=1e-8;
struct Edge
{int to,cap;double cost;int rev;
};
int n,m,S,T;
int maxFlow;
double minCost;
vector<Edge>G[110];
double h[110],dist[110];
int prevv[110],preve[110];
void addedge(int from,int to,int cap,double cost)
{Edge e1={to,cap,cost,(int)G[to].size()};Edge e2={from,0,-cost,(int)G[from].size()};G[from].pb(e1);G[to].pb(e2);
}
void MCMF(int s,int t,int flow)
{memset(h,0,sizeof(h));while(flow>0){priority_queue<P,vector<P>,greater<P> >q;for(int i=1;i<110;i++)dist[i]=inf;dist[s]=0.0;q.push(P(0.0,s));while(!q.empty()){P p=q.top();q.pop();if(dist[p.second]+eps<p.first)continue;int v=p.second;for(int i=0;i<(int)G[v].size();i++){Edge &e=G[v][i];if(e.cap>0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]+eps){dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];prevv[e.to]=v;preve[e.to]=i;q.push(P(dist[e.to],e.to));}}}if(abs(dist[t]-inf)<=eps)break;for(int i=1;i<=T;i++)h[i]+=dist[i];int d=flow;for(int v=t;v!=s;v=prevv[v])d=min(d,G[prevv[v]][preve[v]].cap);flow-=d;maxFlow+=d;minCost+=d*h[t];for(int v=t;v!=s;v=prevv[v]){Edge &e=G[prevv[v]][preve[v]];e.cap-=d;G[v][e.rev].cap+=d;}}
}
void solve()
{scanf("%d%d",&n,&m);S=n+1,T=S+1;minCost=0;maxFlow=0;for(int i=0;i<=T;i++)G[i].clear();for(int i=1;i<=n;i++){int s,b;scanf("%d%d",&s,&b);if(s>b)addedge(S,i,s-b,0.0);if(s<b)addedge(i,T,b-s,0.0);}for(int i=1;i<=m;i++){int u,v,c;double p;scanf("%d%d%d%lf",&u,&v,&c,&p);addedge(u,v,c-1,-log2(1-p));addedge(u,v,1,0.0);}MCMF(S,T,INF);printf("%.2f\n",1-pow(2,-minCost));
}
int main(){int t;scanf("%d",&t);while(t--)solve();return 0;
}

【最小费用最大流(改进Dijkstra)】2016 icpc 青岛 G - Coding Contest相关推荐

  1. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  2. 使用dijkstra求解最小费用最大流网络

    前言 在介绍如何使用dijkstra算法求解最小费用最大流问题的时候,假设看这篇博文的读者已经知道什么是最小费用最大流问题及熟悉dijkstra单源最短路径算法.在这篇博文里面,我并不会过多强调网络拓 ...

  3. 中转站有容量限制的运输问题(最小费用最大流)

    初学,如有问题欢迎交流~ 问题详述 模型假设 线性规划 线性规划模型建立 线性规划模型求解 中转站增加容量限制 网络流 最小费用最大流模型建立 最小费用最大流模型求解 整体算法设计 贝尔曼-福特算法( ...

  4. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  5. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  6. 最大流最小费用java_最小费用最大流及算法

    最大流的网络,可看作为辅送一般货物的运输网络,此时,最大流问题仅表明运输网络运输货物的能力,但没有考虑运送货物的费用.在实际问题中,运送同样数量货物的运输方案可能有多个,因此从中找一个输出费用最小的的 ...

  7. 最大流,最小费用最大流:解析 + 各种板子

    网络流初步 + Edmond-Karp算法 网络流的基本概念 源点,这个点只有流量的流出,没有流入. 汇点,这个点只有流量的流入,没有流出. 容量,每条有向边的最大可承受的流的理论大小. 流量,每条有 ...

  8. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)...

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

  9. P4043 [AHOI2014/JSOI2014]支线剧情(有源汇上下界最小费用可行流)

    传送门 约束每个点至少要经过一次,因此是上下界网络流. 每经过边都需要相应的边权,且要求耗费边权之和最小,因此是最小费用流. 存在多个终点,需要建立汇点 ttt ,因此是有源汇网络流. 即:有源汇上下 ...

最新文章

  1. Opencv读取图片像素值
  2. LintCode: Triangle
  3. 5G NGC — 会话管理模型 — 边缘业务本地分流
  4. jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
  5. 第三章 函数编程
  6. php7 pdo mysql_PHP7添加pdo_mysql扩展
  7. 【jzoj】2018.2.5NOIP普及组——C组模拟赛
  8. go返回多个值和python返回多个值对比
  9. org.apache.maven.archiver.MavenArchiver.getManifest
  10. C++(11)--编程实践1-经典养成类游戏简单实践
  11. 信息摘要技术及算法介绍
  12. Python编程从入门到实践~文件读取
  13. ubuntu18安装sublime
  14. 【安全测试】:某系统短信修改密码,绕过逻辑漏洞
  15. 计算机多媒体技术怎么考一建,一建考试视频
  16. php 保存错误日志,PHP中把错误日志保存在系统日志中_PHP教程
  17. 《学习》13权限管理
  18. matplotlib-legend 位置属性 loc 使用
  19. Java必知必会之socket
  20. 2021前端面试经常被问到的题(附答案)

热门文章

  1. 社交分享拼团持续走红 如何搭建自己的社交拼团平台?
  2. 解决分布式事务中强一致性和最终一致性的思想
  3. C++ string常用函数(翻转字符串、获得字符串子串)(更新中)
  4. 实现全链路监控平台很难吗?Pinpoint、SkyWalking、Zipkin 选型对比
  5. 几月份跳槽或者换工作比较好?
  6. 嵌入式开发板硬件基础-LED的控制
  7. 开心自己的“冒泡排序”被百度百科收录 每一个人都会有梦想,或许不是每一个人,都可以实现自己的梦想,但要永远记得,在我们心里,曾经做过的梦。——To:Hygh
  8. 关于Ubuntu没有声音的解决方法
  9. JZ linux lcd驱动调试
  10. 360浏览器如何禁止切换到兼容模式[终极办法]