Coding Contest

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1751    Accepted Submission(s): 374

Problem Description
A coding contest will be held in this university, in a huge playground. The whole playground would be divided into N blocks, and there would be M directed paths linking these blocks. The i-th path goes from the ui-th block to the vi-th block. Your task is to solve the lunch issue. According to the arrangement, there are sicompetitors in the i-th block. Limited to the size of table, bi bags of lunch including breads, sausages and milk would be put in the i-th block. As a result, some competitors need to move to another block to access lunch. However, the playground is temporary, as a result there would be so many wires on the path.
For the i-th path, the wires have been stabilized at first and the first competitor who walker through it would not break the wires. Since then, however, when a person go through the i - th path, there is a chance of pi to touch
the wires and affect the whole networks. Moreover, to protect these wires, no more than ci competitors are allowed to walk through the i-th path.
Now you need to find a way for all competitors to get their lunch, and minimize the possibility of network crashing.
 
Input
The first line of input contains an integer t which is the number of test cases. Then t test cases follow.
For each test case, the first line consists of two integers N (N ≤ 100) and M (M ≤ 5000). Each of the next N lines contains two integers si and bi (si , bi ≤ 200).
Each of the next M lines contains three integers ui , vi and ci(ci ≤ 100) and a float-point number pi(0 < pi < 1).
It is guaranteed that there is at least one way to let every competitor has lunch.
 
Output
For each turn of each case, output the minimum possibility that the networks would break down. Round it to 2 digits.
 
Sample Input
1
4 4
2 0
0 3
3 0
0 3
1 2 5 0.5
3 2 5 0.5
1 4 5 0.5
3 4 5 0.5
 
Sample Output
0.50
 
Source
 
 
 
题意:有n个区域,每个区域有一些人数si和食物bi,区域之间有m条定向路径,每条路径有人数通过上限ci。路径之间铺了电线,每当有人通过路径时有pi的概率会触碰到电线,但是第一个通过的人一定不会触碰到电线。求每个人都通过路径获取到食物后触碰到电线的最小概率。
思路:首先每个区域的一些人都直接获取自己区域的食物,如果人过量,源点链接本区域,容量是过量的人数,费用是0;如果食物过量,本区域连接汇点,容量是过量的食物,费用是0。剩下的人通过路径到其他区域获取食物,m条路径之间建立边,首先是一定不会触碰,容量是1,花费为0,;接下来的才是容量为ci-1的边,并且还拥有一个费用,这就是一个最小费用最大流的问题,但是这个费用怎么转换呢?把每个概率取log(1-pi),并且取负数-log(1-pi)。这样的话最小花费(-log(x1))+(-log(x2))+(-log(x3))+....=-(log(x1)+log(x2)+log(x3)+...)=-log(x1*x2*x3...)。最后最小费用ans取负数再作为e的指数,即exp(-ans)是最大乘积。
 
代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<double,int> P;
#define PI acos(-1.0)
const int maxn=,maxm=1e5+,inf=0x3f3f3f3f,mod=1e9+;
const ll INF=1e18+;
const double eps=0.000001;
struct edge
{
int from,to;
int cap;
double cost;
int rev;
};
int NN;
vector<edge>G[maxn];
double h[maxn];
///顶点的势,取h(u)=(s到u的最短距离),边e=(u,v)的长度变成d`(e)=d(e)+h(u)-h(v)>=0
double dist[maxn];
int prevv[maxn],preve[maxn];///前驱结点和对应的边
void addedge(int u,int v,int cap,double cost)
{
edge e;
e.from=u,e.to=v,e.cap=cap,e.cost=cost,e.rev=G[v].size();
G[u].push_back(e);
e.from=v,e.to=u,e.cap=,e.cost=-cost,e.rev=G[u].size()-;
G[v].push_back(e);
}
double min_cost_flow(int s,int t,int f)
{
double res=0.0;
fill(h,h+NN,0.0);
while(f>)
{
priority_queue<P,vector<P>,greater<P> >q;
fill(dist,dist+NN,inf);
dist[s]=0.0;
q.push(P(dist[s],s));
while(!q.empty())
{
P p=q.top();
q.pop();
int u=p.second;
if(dist[u]<p.first) continue;
for(int i=; i<G[u].size(); i++)
{
edge e=G[u][i];
if(e.cap>&&dist[e.to]-(dist[u]+e.cost+h[u]-h[e.to])>=eps)
{
dist[e.to]=dist[u]+e.cost+h[u]-h[e.to];
prevv[e.to]=u;
preve[e.to]=i;
q.push(P(dist[e.to],e.to));
}
}
}
if(fabs(dist[t]-inf)<=eps) return res;
for(int i=; i<NN; i++) h[i]+=dist[i];
int d=f;
for(int i=t; i!=s; i=prevv[i])
d=min(d,G[prevv[i]][preve[i]].cap);
f-=d;
res+=d*h[t];
//cout<<d<<" "<<h[t]<<" "<<d*h[t]<<endl;
for(int i=t; i!=s; i=prevv[i])
{
//cout<<i<<" ";
edge &e=G[prevv[i]][preve[i]];
e.cap-=d;
G[i][e.rev].cap+=d;
}
//cout<<s<<endl;
}
return res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
int s=,t=n+,f;
NN=t+;
for(int i=; i<=n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
int x=min(a,b);
a-=x,b-=x;
if(a>) addedge(s,i,a,);
else if(b>) addedge(i,t,b,);
}
for(int i=; i<=m; i++)
{
int u,v,cap;
double cost;
scanf("%d%d%d%lf",&u,&v,&cap,&cost);
if(cap>) addedge(u,v,,);
if(cap->) addedge(u,v,cap-,-*log(1.0-cost));
}
double sum=min_cost_flow(s,t,inf);
printf("%.2f\n",1.0-exp(-1.0*sum));
for(int i=; i<NN; i++) G[i].clear();
}
return ;
}

最小费用最大流

HDU 5988.Coding Contest 最小费用最大流的更多相关文章

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

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

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

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

  3. hdu 1533 Going Home 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 On a grid map there are n little men and n house ...

  4. hdu 3667(拆边+最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...

  5. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  6. hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))

    Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. hdu 1533 Going Home 最小费用最大流 入门题

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. POJ 2195 & HDU 1533 Going Home(最小费用最大流)

    这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...

  9. HDU 5988 Coding Contest 最小费用流 cost->double

    Problem Description A coding contest will be held in this university, in a huge playground. The whol ...

随机推荐

  1. yii添加验证码 和重复密码

    <?phpnamespace frontend\models; use common\models\User;use yii\base\Model;use Yii; /** * Signup f ...

  2. linux 内核移植

    1. 下载内核源码linux-2.6.34,解压到工作目录下. 2. 首先在内核中增加一个 SOC ,到 /arch/arm/mach-s3c64xx 下将mach-smdk6410.c 复制成 ma ...

  3. java fastJson

    // 大区的数据 String cityList = "[{'title':'华北','value':'1','children':[{'title':'山东','value':'1.1', ...

  4. centos 6.x系统升级glibc库至2.15版本的快速解决办法

    CentOS 6.x系统升级glibc库至2.15版本的快速解决办法  1.先确保相关软件包已经安装 yum install -y glibc yum install -y glibc-common ...

  5. justify-content & align-items & align-content

    [justify-content & align-items & align-content] 三个属性均作用于container. justify-content用于控制main-a ...

  6. Spread Syntax

    [Spread Syntax] The spread syntax allows an expression to be expanded in places where multiple argum ...

  7. CentOS 下搭建Tomcat

    1.下载tomcat软件包 wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.0.53/bin/apache-tomcat-8.0.53.ta ...

  8. FZU-1752.(A^B mod C)(快速幂与快速乘优化)

    我把自己演哭了... 心酸.jpg 写了很多个版本的,包括数学公式暴力,快速幂TLE等等,最后想到了优化快速幂里的乘法,因为会爆longlong,但是和别人优化的效率简直是千差万别...? 本题大意: ...

  9. Cisco无线AP上联口为trunk时无法注册故障处理

    网络环境:WLC5520  AP:1832i-h-k9 客户实施过程中电话告知其将AP和交换机互联的端口类型设置为TRUNK口后,AP无法注册到WLC上,后经过查看配置发现客户用于AP管理的VLAN为 ...

  10. http://www.bugku.com:Bugku——jsfuckWEB5(http://120.24.86.145:8002/web5/index.php)

      今天又做了bugku上面的一道题.使用到了jsfuck,它是什么捏?   它是Javascript原子化的一种简易表达方式,用[]()!+就可以表示所有的Javascript字符,不依赖于浏览器. ...