从源点向每个点连接容量为该点人数,费用为1的边,

把原图中的每条边拆成两条,一条容量为1,费用为1,另一条容量为ci-1,费用为1-pi

从每个点向汇点连接容量为该点面包数量,费用为1的边。

跑的费用流为按照乘积跑个最大费用流。

可以取个对数,乘法变成加法,

可以再取个负数,最大费用变成最小费用。

别忘了最后还原回来。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
#define E 2.71828182845904523536
#define EPS 0.00000001
#define MAXN 201
#define MAXM 25001
#define INF 2147483647
int S,T;
int en,u[MAXM],v[MAXM],first[MAXN],__next[MAXM],cap[MAXM];
double cost[MAXM];//__next Array
bool inq[MAXN];
double d[MAXN];/*spfa*/
int p[MAXN]/*spfa*/,a[MAXN]/*????*/;
queue<int>q;
void Init_MCMF(){memset(first,-1,sizeof(first));en=0;}
void AddEdge(const int &U,const int &V,const int &W,const double &C)
{
u[en]=U; v[en]=V; cap[en]=W; cost[en]=C;
__next[en]=first[U]; first[U]=en++;
u[en]=V; v[en]=U; cap[en]=0; cost[en]=-C;
__next[en]=first[V]; first[V]=en++;
}
bool Spfa(int &Flow,double &Cost)
{
memset(d,0x7f,sizeof(d));
memset(inq,0,sizeof(inq));
d[S]=0; inq[S]=1; p[S]=0; a[S]=INF; q.push(S);
while(!q.empty())
{
int U=q.front(); q.pop(); inq[U]=0;
for(int i=first[U];i!=-1;i=__next[i])
if(cap[i] && d[v[i]]-(d[U]+cost[i])>EPS)
{
d[v[i]]=d[U]+cost[i];
p[v[i]]=i;
a[v[i]]=min(a[U],cap[i]);
if(!inq[v[i]]) {q.push(v[i]); inq[v[i]]=1;}
}
}
if(d[T]-2000000000.0>EPS) return 0;
Flow+=a[T]; Cost+=d[T]*(double)a[T]; int U=T;
while(U!=S)
{
cap[p[U]]-=a[T]; cap[p[U]^1]+=a[T];
U=u[p[U]];
}
return 1;
}
double Mincost()
{
int Flow=0;
double Cost=0;
while(Spfa(Flow,Cost));
return Cost;
}
int Zu,n,m;
int main(){
// freopen("g.in","r",stdin);
int x,y,z;
double p;
scanf("%d",&Zu);
for(int zu=1;zu<=Zu;++zu){
Init_MCMF();
scanf("%d%d",&n,&m);
S=n+1; T=n+2;
for(int i=1;i<=n;++i){
scanf("%d%d",&x,&y);
AddEdge(S,i,x,0);
AddEdge(i,T,y,0);
}
for(int i=1;i<=m;++i){
scanf("%d%d%d%lf",&x,&y,&z,&p);
if(z>0){
AddEdge(x,y,1,0);
AddEdge(x,y,z-1,-log(1.0-p));
}
}
printf("%.2lf\n",1.0-pow(E,-Mincost()));
}
return 0;
}

【费用流】hdu5988 Coding Contest的更多相关文章

  1. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  2. hdu5988 Coding Contest

    首先这是个费用流,用log转乘法为加法,外加模板的修改,需加eps 下面是废话,最好别看 闲来无事(鼓起勇气)写这篇博客 这是个自带影像回访的题目 青岛的炼铜之旅,大学的acm生涯就这样结束了.或许还 ...

  3. HDU5988 Coding Contest(费用流)

    2016青岛现场赛的一题,由于第一次走过不会产生影响,需要拆点,不过比赛时没想到,此外还有许多细节要注意,如要加eps,时间卡得较紧要注意细节优化等 #include <iostream> ...

  4. HDU5988/nowcoder 207G - Coding Contest - [最小费用最大流]

    题目链接:https://www.nowcoder.com/acm/contest/207/G 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5988 ...

  5. HDU5988 - 2016icpc青岛 - G - Coding Contest 费用流(利用对数化乘为加

    HDU5988 题意: 有n个区域,每个区域有s个人,b份饭.现在告诉你每个区域间的有向路径,每条路有容量和损坏路径的概率.问如何走可以使得路径不被破坏的概率最小.第一个人走某条道路是百分百不会损坏道 ...

  6. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  7. Coding Contest(费用流变形题,double)

    Coding Contest http://acm.hdu.edu.cn/showproblem.php?pid=5988 Time Limit: 2000/1000 MS (Java/Others) ...

  8. 2016青岛区域赛.Coding Contest(费用流 + 概率计算转换为加法计算)

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  9. HDU 5988 Coding Contest(最小费用最大流变形)

    Problem DescriptionA coding contest will be held in this university, in a huge playground. The whole ...

随机推荐

  1. jqgrid 翻页记录选中行

    简单的jqgrid列表 $("#list").jqGrid({ url:contextPath + "/getList", postData: data, da ...

  2. [Leetcode Week13]Search a 2D Matrix

    Search a 2D Matrix 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/search-a-2d-matrix/description/ D ...

  3. 【Android framework】AndroidManagerService初始化流程

    源码基于Android 4.4.   system_server的初始化 system_server受AMS管理,负责启动framework-res.apk和SettingsProvider.apk. ...

  4. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

  5. Educational Codeforces Round 23 补题小结

    昨晚听说有教做人场,去补了下玩. 大概我的水平能做个5/6的样子? (不会二进制Trie啊,我真菜) A. 傻逼题.大概可以看成向量加法,判断下就好了. #include<iostream> ...

  6. how to create view (windows)

    View Server List  IP address: 200.xx.xx.xx How to create a new view ssh new view server by your Unix ...

  7. 同步方法-java

    除了同步代码块能实现同步执行外,同步方法也可以. 先看下同步代码块实现同步执行: public class Demo4 { public static void main(String[] args) ...

  8. POJ 1733 Parity game(带权并查集)

    题目链接:http://poj.org/problem?id=1733 题目大意:给你m条信息,每条信息告诉你区间l~r的1的个数是奇数还是偶数,如果后面出现信息跟前面矛盾则这条信息是错误的,问在第一 ...

  9. [PAT] 1141 PAT Ranking of Institutions(25 分)

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  10. vue 数组和对象不能直接赋值情况和解决方法

    Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue 当你修改数组的长度时,例如:vm.items.length = ...