即在总流量不变的情况下调整每条边的流量。显然先二分答案变为求最小费用。容易想到直接流量清空跑费用流,但复杂度略有些高。

  首先需要知道(不知道也行?)一种平时基本不用的求最小费用流的算法——消圈法。算法基于下面的定理:如果残量网络中有负环,当前费用流一定不是最小费用流(似乎很显然?)。注意到分数规划之后,我们需要知道的只是在调整边权后的网络里,最小费用流是否可能比原来更优,于是构造出残量网络,spfa判负环即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 5010
#define M 3010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
const double eps=1E-;
int n,m,p[N],t,q[N],cnt[N];
double dis[N];
bool flag[N];
struct data{int to,nxt;double len;
}edge[M<<];
void addedge(int x,int y,double z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
int inc(int &x){x++;if (x>n+) x-=n+;return x;}
bool spfa()
{
memset(flag,,sizeof(flag));
memset(cnt,,sizeof(cnt));
int head=,tail=;q[]=n-;
for (int i=;i<=n;i++) dis[i]=;dis[n-]=;
do
{
int x=q[inc(head)];flag[x]=;
for (int i=p[x];i;i=edge[i].nxt)
if (dis[x]+edge[i].len<dis[edge[i].to])
{
dis[edge[i].to]=dis[x]+edge[i].len;
if (!flag[edge[i].to])
{
flag[edge[i].to]=;
q[inc(tail)]=edge[i].to;
cnt[edge[i].to]++;
if (cnt[edge[i].to]>=n) return ;
}
}
}while (head!=tail);
return ;
}
bool check(double k)
{
for (int i=;i<=t;i++) edge[i].len+=k;
bool ans=spfa();
for (int i=;i<=t;i++) edge[i].len-=k;
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3597.in","r",stdin);
freopen("bzoj3597.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read()+,m=read();
for (int i=;i<=m;i++)
{
int x=read(),y=read(),a=read(),b=read(),c=read(),d=read();
addedge(x,y,b+d);
if (c>) addedge(y,x,a-d);
}
double l=eps,r=,ans;
while (l+eps<r)
{
double mid=(l+r)/;
if (check(mid)) ans=mid,l=mid+eps;
else r=mid-eps;
}
printf("%.2f",ans);
return ;
}

最新文章

  1. hibernate的三表查询
  2. Unity3D连接sqlite数据库操作C#版
  3. STM32环境搭建/学习观点/自学方法 入门必看
  4. Rnadom Teams
  5. Oracle-01033错误处理
  6. 关于CSS3的代码总结(部分)
  7. [PaPaPa][需求说明书][V0.1]
  8. Jsp内置对象及EL表达式的使用
  9. App can入门
  10. RocketMQ在Windows平台下环境搭建
  11. Error Handling in ASP.NET Core
  12. js 按条件 serialize() 对应标签
  13. vue之地址栏#号问题
  14. Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)
  15. vue内置指令与自定义指令
  16. pandas 从入门到遗忘
  17. [重要] Django 多条件多表查询实例问题
  18. 快速自动安装dart
  19. numpy--深度学习中的线代基础
  20. PAT 1070 结绳(25)(代码)

热门文章

  1. Android学习之六种事件响应方法汇总
  2. SkylineGlobe 如何实现FlyTo定位到目标点之后触发的事件函数
  3. TerraExplorer Add-ons 和TEZ使用说明
  4. WPF 模拟UI 键盘录入
  5. C# 深浅复制 MemberwiseClone
  6. .net core 中使用httpclient,HttpClientFactory的问题
  7. SQL多表查询总结
  8. vue全局 关键字搜索 v-search
  9. 《Linux内核分析》第五周学习总结
  10. TestSushu1