纪念博客又一次爆炸了

首先,对于本题中,我们可以发现,保证存在正整数解,就表示一定费用会降低。又因为一旦加大的流量,费用一定会变大,所以总流量一定是不变的

那么我们这时候就需要考虑一个退流的过程

对于原图每一条\(u->v,c>0\)的边,我们在新图中建一条\(v->u,价值是a-d\)

表示退这个流要花费的费用,相当于退流的过程

对于原图任意一条\(u->v\)的边,我们在新图中建一条\(u->v,价值是b+d\)的边,相当于扩流的过程

那么只有成环的时候,才能满足流量平衡这个条件。

正好和消圈定理相类似

所谓消圈定理
就是在某个流 f 中,如果其对应的残余网络没有负圈(剩余流量为 0 的边视为不存在)
那它一定就是当前流量下的最小费用流。
反之亦然。
即「f 是最小费用流等价于其残余网络中没有负圈」。

那根据题目要求的是个比例,那我们一定是只修改最大的那个环就行。

那么我们考虑分数规划一下

二分\(mid <= max(\frac{x-y}{k})\)

\[mid\times k\le x-y
\]
\[mid\times k + (y-x) \le 0
\]

由于在一个环中,k就是这个环的大小,我们可以考虑把每个\(mid\)分配到每个边,也就是转化成了

每条边的权值在原来新图的基础上\(+mid\),然后\(check\)是否存在负(0)环

这时候直接上\(spfa\)就好,

不过之前的问题转化,还是很有难度啊

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk makr_pair
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 50010;
const int maxm = 1e6+1e2;
struct Node{
int u,v,a,b,c,d;
};
Node a[maxn];
int point[maxn],nxt[maxm],to[maxm];
int inque[maxn];
int vis[maxn];
double val[maxm];
queue<int> q;
int cnt,n,m;
double dis[maxn];
int x[maxm],y[maxm];
double w[maxm];
double l=0,r=1e9;
int tmp;
double ans;
bool flag;
int s,t;
void addedge(int x,int y,double w)
{
//cout<<x<<" "<<y<<" "<<w<<endl;
nxt[++cnt]=point[x];
to[cnt]=y;
val[cnt]=w;
point[x]=cnt;
}
void spfa(int s)
{
while (!q.empty()) q.pop();
for (int i=1;i<=n;i++) dis[i]=1e9;
memset(inque,0,sizeof(inque));
memset(vis,0,sizeof(vis));
dis[s]=0;
inque[s]=1;
q.push(s);
while (!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;
inque[x]++;
if (inque[x]>=n+1)
{
flag=true;
return;
}
//cout<<1<<endl;
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (dis[p]>=dis[x]+val[i])
{
dis[p]=dis[x]+val[i];
if (!vis[p])
{
q.push(p);
vis[p]=1;
}
}
}
}
}
bool check(double mid)
{
cnt=0;
flag=false;
memset(point,0,sizeof(point));
for (int i=1;i<=tmp;i++)
addedge(x[i],y[i],w[i]+mid);
spfa(n-1);
if (flag) return true;
else return false;
}
int main()
{
n=read(),m=read();
n+=2;
for (int i=1;i<=m;i++)
{
int u=read(),v=read(),a=read(),b=read(),c=read(),d=read();
++tmp;
x[tmp]=u;
y[tmp]=v;
w[tmp]=b+d;
if (c>0)
{
++tmp;
x[tmp]=v;
y[tmp]=u;
w[tmp]=a-d;
}
}
// cout<<check(103)<<endl;
// return 0;
while (r-l>1e-3){
double mid = (l+r)/2;
if (check(mid)) ans=mid,l=mid;
else r=mid;
}
printf("%.2lf\n",ans);
return 0;
}

洛谷3288 SCOI2014方伯伯运椰子(分数规划+spfa)的更多相关文章

  1. 3597: [Scoi2014]方伯伯运椰子[分数规划]

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 404  Solved: 249 [Submit][Sta ...

  2. [bzoj3597][scoi2014]方伯伯运椰子——分数规划,负环

    题解 目标就是 \[Maximize\ \lambda = \frac{X-Y}{k}\] 按照分数规划的一般规律, 构造: \[g(\lambda) = \lambda k + Y - X\] 由于 ...

  3. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  4. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  5. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  6. 洛谷P3286 [SCOI2014]方伯伯的商场之旅

    题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...

  7. 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树

    洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...

  8. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3597 Description 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十 ...

  9. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

随机推荐

  1. 一、Rabbitmq的简单介绍

    以下只是本人从零学习过程的整理 部分内容参考地址:https://www.cnblogs.com/ysocean/p/9240877.html 1.RabbitMQ的概念 RabbitMQ是实现了高级 ...

  2. Python脚本导出AWS EC2资源清单

    环境需求 单位现在每隔一段时间需要核对一下 AWS 正在运行的 EC2 资源清单,为了避免核对失误以及重复性的工作,打算用脚本来解决这一重复性的工作.大概思路为 通过 AWS AK.SK 来索取 AW ...

  3. Java基础(四)——抽象类和接口

    一.抽象类 1.介绍 使用关键字 abstract 定义抽象类. abstract定义抽象方法,只有声明,不用实现. 包含抽象方法的类必须定义为抽象类. 抽象类中可以有普通方法,也可以有抽象方法. 抽 ...

  4. 20210716考试-NOIP19

    u,v,w. 这场考过. T1 u 差分裸题 #include<bits/stdc++.h> using namespace std; const int N=5000; int n,m; ...

  5. docker一分钟搭建nginx服务器

    运行nginx服务 拉取: docker pull nginx:1.17.9 运行: docker run -d --name nginx -P 80:80 nginx:1.17.9 -d表示在后台启 ...

  6. Filter案例之敏感词过滤和代理模式

    一.需求分析 二 .代理模式 1.概念 2.代码实现 代理对象可以强转为真实对象,即对应的接口类: 3.通过代理增强方法 其中,方法对象invoke真实对象,反射原理: 三.过滤敏感词汇案例代码实现 ...

  7. session案例之验证码

    一.需求分析 其中,一张图片就是一个单独的请求: 一个验证验证码的Servlet,还有一个验证用户名和密码的Servlet,两次都可能有错误信息返回到前端页面,所以前面页面要从request域中获取返 ...

  8. vue+element+echarts柱状图+列表

    前端由vue+element搭建框架,引入vue和element的index.js和css就可以写页面: 页面和js可以echarts官网实例看下都是有的,主要看下如何动态赋值: 柱状图和列表: &l ...

  9. SpringSecurity-Shiro-初见

    目录 简介 实战环境搭建 SpringSecurity 认证和授权 权限控制和注销 记住我 Shiro 快速上手 shiro整合mybais 简介 在 Web 开发中,安全一直是非常重要的一个方面. ...

  10. ysoserial CommonsColletions4分析

    ysoserial CommonsColletions4分析 其实CC4就是 CC3前半部分和CC2后半部分 拼接组成的,没有什么新的知识点. 不过要注意的是,CC4和CC2一样需要在commons- ...