题目链接:点击查看

题目大意:给出n个点和m条边,每个点有ai个人和bi份食物,每条边最多能通过ci个人,以及除了第一个人之外,其他人通过每条边触电的概率为pi,在以上约束下,要求每个人都必须吃到一份食物,问最小触电概率是多少,题目保证至少有一组答案

题目分析:首先我们需要将问题转换一下,每个点有ai个人和bi份食物,可以让当前的人和食物尽可能的匹配,只有三种情况:

  1. ai>bi:此时人有剩余,我们将其视为“人”点
  2. ai<bi:此时食物有剩余,我们将其视为“食物”点
  3. ai=bi:此时人和食物完全匹配,则忽略该点

先忽略触电的约束条件,我们的目的是要让所有的人都找到一份食物,所以我们可以先建图,让源点指向每一个“人”点,权值为该点人的数量,费用为0,再让每个“食物”点指向汇点,权值为该点食物的数量,费用为0,然后就是让“人”点与“食物”点建边了,这个就需要我们用概率来作为边权了,如果我们直接求触电的概率比较难求,但正难则反,我们可以求不触电的概率,最后用1减去这个概率就是答案了,因为每条边上的费用都是单位流量上的费用,并且最小费用只能求和,但我们最终需要求解的公式是这个:

也就是说需要求后面那一块连乘的部分,其实我们可以直接取log,就能化乘为和了:(以2为底以10为底都可以)

因为答案P是触电的概率,我们想让其尽量小,那么就需要让2的指数上尽量大,这样一下子就豁然开朗了,只需要让“人”点到“食物”点的边权为最多能通过的人,单位费用为不触电的概率就好了

建好边后直接跑一边最大费用最大流就能跑出2的指数了,再套回上面的公式就能得到答案了

不过这个题目有个小坑,就是在spfa更新状态时的比较大小,如果不加eps会T掉,然后费用流对于正常的模板将里面的cost和距离都改成double就好了,其他的都是一样的

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;//点const int M=5100;//边const double eps=1e-8;struct Edge
{int to,w,next;double cost;
}edge[M<<2];int head[N],cnt,n,m;void addedge(int u,int v,int w,double cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}double d[N];int incf[N],pre[N];bool vis[N];bool spfa(int s,int t)
{for(int i=0;i<N;i++)d[i]=-1e10;memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;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;int w=edge[i].w;double cost=edge[i].cost;if(!w)continue;if(d[v]<d[u]+cost-eps){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}return pre[t]!=-1;
}double update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];x=edge[i^1].to;}return d[t]*incf[t];
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}double solve(int st,int ed)
{double ans=0;while(spfa(st,ed))ans+=update(st,ed);return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){init();scanf("%d%d",&n,&m);int st=N-1,ed=st-1;for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);int temp=x-y;if(temp<0)addedge(i,ed,-temp,0);if(temp>0)addedge(st,i,temp,0);}while(m--){int u,v,w;double cost;scanf("%d%d%d%lf",&u,&v,&w,&cost);if(w>0)addedge(u,v,1,0);if(w>1)addedge(u,v,w-1,1.0*log2(1.0-cost));}printf("%.2f\n",1.0-pow(2.0,solve(st,ed)));}return 0;
}

HDU - 5988 Coding Contest(最大费用最大流+思维建边)相关推荐

  1. 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n天每天所需要的新餐巾的数量,现在有多种方式可以获得新餐巾,问如何运营能使花费最少: 直接购买,花费为cost 将脏餐巾送到快洗部,需要洗t1天,花费为c1 将脏餐巾 ...

  2. 洛谷 - P3358 最长k可重区间集问题(最大费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个开区间,现在要求从中选取一定数量的区间,需要满足: 对于任意点x,所选取的区间中包含点x的个数小于等于k 区间长度和最大 要求输出最长的区间长度和 题目分析:一开 ...

  3. CodeForces - 739E Gosha is hunting(最大费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出两种精灵球来捉n只精灵,方便起见我们称为a个aa球和b个bb球,对于每只精灵: 若单独用aa球捕捉,成功的概率为p 若单独用bb球捕捉,成功的概率为u 若同时用aa球 ...

  4. CodeForces - 863F Almost Permutation(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个限制,每个限制分为两种类型: 1 l r val:区间[l,r]内的数都大于等于val 2 l r val:区间[l,r]内的数都小于等于val 并且规定每个数出 ...

  5. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:现在有n天需要志愿者,每一天需要招募的人数是Ai个人,现在有m类志愿者,每类志愿者可以在[l,r]天内被招募,需要花费的代价为Ci,现在需要安排一种招募方式,可以使得总花 ...

  6. POJ - 3680 Intervals(最大费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个开区间,每个开区间都有一个权值,要求在重叠次数不超过k次的情况下,选出权值和最大的数个区间 题目分析:和之前网络流24题里最大k可重区间集问题一模一样的模板,就不 ...

  7. 洛谷 - P3357 最长k可重线段集问题(最大费用最大流+思维建边+拆点)

    题目链接:点击查看 题目大意:给出n条开线段,开线段的意思就是端点的两个点属于开区间,不属于线段中,让从中选出数条线段,满足: 在x轴选取任何一个点,选取线段向x轴映射到该点的次数小于等于k 所选线段 ...

  8. HDU 2282 Chocolate (最小费用最大流)

    HDU  2282 Chocolate (最小费用最大流) #include <iostream> #include <cstdio> #include <queue&g ...

  9. HDU Problem - 3338 Kakuro Extension (最大流,建图)

    题目链接 Problem Description If you solved problem like this, forget it.Because you need to use a comple ...

最新文章

  1. Water Research:南科大夏雨+唐圆圆-台风对深圳沿海微塑料和微塑圈的影响
  2. 李彦宏/王坚/王传福等上榜“中国工程院2019院士增选候选人”引争议,实至名归吗?...
  3. nginx做透明代理
  4. html5 图片上传 预览
  5. 最大和 -- 最大子矩阵
  6. 转账为demo,spring事务
  7. 《Spring 3.0就这么简单》——1.5 业务层
  8. cocos2d-x帧动画实现(续)
  9. 向小伙伴讲讲搜索引擎?读完这个文章先
  10. 计算机等级考试教学论文,计算机等级考试课程教学论文
  11. 版本控制/文件管理系统SVN命令整理:提交修改更新撤销分支
  12. Java系统日志管理
  13. 网络爬虫——超级鹰源码下载
  14. Java获取微信用户昵称时昵称里有特殊符号导致插入数据库失败(解决方案)
  15. 第三篇第二章室内外消防给水系统
  16. 奔梦向前-代码实现表白男生女生-2020-06-15
  17. Word、Excel、PPT等图标异常解决方案
  18. 2019年6月1日第十四周UML项目日志
  19. 视频直播系统源码,平台在日间和夜间模式之间来回切换
  20. MQTT-java使用说明

热门文章

  1. 尚硅谷_MySQL常见命令介绍
  2. MySQL高级 - 日志 - 二进制日志(statement)
  3. Nginx的rewrite之break指令
  4. kubernetes-Service
  5. 什么时候用不到索引?
  6. Bean标签范围配置
  7. Hive的安装-Hive的交互方式
  8. apollo分布式配置中心原理
  9. SpringCloud:Ribbon负载均衡(基本使用、 负载均衡、自定义配置、禁用 Eureka 实现 Ribbon 调用)
  10. SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)