HDU 5988.Coding Contest 最小费用最大流
Coding Contest
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1751 Accepted Submission(s): 374
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.
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.
#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 最小费用最大流的更多相关文章
- HDU 5988 Coding Contest(最小费用最大流变形)
Problem DescriptionA coding contest will be held in this university, in a huge playground. The whole ...
- HDU5988/nowcoder 207G - Coding Contest - [最小费用最大流]
题目链接:https://www.nowcoder.com/acm/contest/207/G 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5988 ...
- 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 ...
- hdu 3667(拆边+最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 1533 Going Home 最小费用最大流 入门题
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- POJ 2195 & HDU 1533 Going Home(最小费用最大流)
这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...
- HDU 5988 Coding Contest 最小费用流 cost->double
Problem Description A coding contest will be held in this university, in a huge playground. The whol ...
随机推荐
- clone()与image和 cloneTo()
Mat image = imread("1.png" ) ; Mat image1 ; Mat image1(image) ;//仅是创建了Mat的头部分,image1与image ...
- The APK failed to install. Error:Could not parse error string.
问题一: The APK failed to install. Error:Could not parse error string. 今天拖拽自己的apk到模拟器上运行,报上述错误. 搜索解决方案. ...
- react input的几个坑
[react input的几个坑] 1.input标签中设置value后,input进入controlled模式,valuechange由自动变为手动,导致input无法编辑.如: <input ...
- 搭建php渗透测试环境
php服务器下载地址 http://vdisk.weibo.com/s/D9I4jIIfNddvh 在C盘下创建一个www文件夹 安装phpstudy 下一步安装 修改配置文件 将端口改成8080 保 ...
- msf客户端渗透(四):关闭UAC,hash、防火墙、服务、磁盘、DEP、防病毒、远程桌面、桌面截图、获取tooken
关闭UAC 如果你获得一个system权限的session 进入到这个session 进入到shell 依次输入以下命令 cmd.exe /k %windir%\System32\reg.exe AD ...
- C#中与C++中的 LPWSTR(wchar_t *) 对应的类型
1.设置 CharSet = CharSet.Unicode [DllImport("test.dll", EntryPoint = "sum()", Char ...
- as3.0控制声音大小
//加载声音 var sound:Sound=new Sound(); sound.load(new URLRequest("1.mp3")): //声明声道 var soundC ...
- open suse linux 磁盘分区
在opensuse 中我是这样对磁盘进行配置的 先添加一块磁盘任意大小 reboot 重启 ls /dev/ | grep sd 可以看到有一块sdb 的磁盘没有分区 fdisk /dev/sdb n ...
- awk参数解析
# awk --help Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or ...
- TableView下拉刷新崩溃解决办法
return cell;上边加判断 if(self.dataArray.count<1){ return cell; }