题解

目标就是

\[Maximize\ \lambda = \frac{X-Y}{k}
\]

按照分数规划的一般规律,

构造:

\[g(\lambda) = \lambda k + Y - X
\]

由于总流量不变,我们考虑转移流量。

注意到,对于每条边,我们如果增加其容量则会增加(b[i]+d[i]+lambda)点值,如果减少就是(a[i]-d[i]+lambda)点值。

如果可以构成一个负环,那么就一定可以更优。

所以我们二分\(\lambda\),check即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define eps 1e-5
struct haha {
int x, y, a, b, c, d;
};
struct edge {
int from, to;
double cost;
};
const int maxn = 5005;
vector<edge> G[maxn];
haha b[maxn];
int n, m;
int vis[maxn], flag;
double dist[maxn];
void add_edge(int from, int to, double cost) {
G[from].push_back((edge){from, to, cost});
}
void dfs(int i) {
vis[i] = 1;
for (int j = 0; j < G[i].size(); j++) {
edge &e = G[i][j];
if (dist[e.to] > dist[i] + e.cost) {
if (vis[e.to])
flag = 1;
else {
dist[e.to] = dist[i] + e.cost;
dfs(e.to);
}
}
}
vis[i] = 0;
}
bool check(double lambda) {
for (int i = 1; i <= n; i++)
G[i].clear();
for (int i = 1; i <= m; i++) {
if (b[i].c)
add_edge(b[i].y, b[i].x, b[i].a - b[i].d + lambda);
add_edge(b[i].x, b[i].y, b[i].b + b[i].d + lambda);
}
flag = 0;
memset(vis, 0, sizeof(vis));
memset(dist, 0, sizeof(dist));
for (int i = 1; i <= n && !flag; i++) {
dfs(i);
}
return flag;
}
int main() {
// freopen("input", "r", stdin);
scanf("%d %d", &n, &m);
n += 2;
for (int i = 1; i <= m; i++)
scanf("%d%d%d%d%d%d", &b[i].x, &b[i].y, &b[i].a, &b[i].b, &b[i].c, &b[i].d);
double L = 0, R = 10000000;
while (R - L > eps) {
double mid = (L + R) / 2;
if (check(mid))
L = mid;
else
R = mid;
}
printf("%.2f\n", L);
}

总结

  1. 图上的分数规划问题要考虑分摊到每个边上。
  2. 分数规划问题要注意double的赋值。

最新文章

  1. C#,.Net 学习资源
  2. 使用Ring Buffer构建高性能的文件写入程序
  3. php函数获取文件名
  4. TextFile 类的创写
  5. 【JSP】JSTL使用core标签总结(不断更新中)
  6. CentOS 6.4 64位 安装 apache-tomcat-6.0.43
  7. jquery表单实时验证
  8. nfs:server 172.168.1.22 not responding,still trying问题解决方法 平台为RealARM 210平台
  9. canvas动画3:交互
  10. Xcode出现may cause a leak非忽略的解决方法
  11. 驰骋工作流引擎-底层开发API 说明文档
  12. Excel中最精确的计算年龄的公式
  13. 使用Canvas绘制简单的时钟控件
  14. DIV正确打开方式 ~~~~哈哈哈
  15. 初识 go 语言:数据类型
  16. Excel动态图表
  17. [C++]Linux之头文件sys/types.h[/usr/include/sys]
  18. win2003远程桌面怎么切换到多用户?
  19. Springboot中如何在Utils类中使用@Autowired注入bean
  20. Openstack-Ceilometer-Alarm运行机制

热门文章

  1. LeetCode 206——反转链表
  2. 并查集——poj1308(并查集延伸)
  3. Jlink 软件断点和硬件断点
  4. PHP变量的实现原理【转】
  5. PHP变量类型转换
  6. Oracle中SQL语言介绍以及基本用法
  7. 基于oracle的sql(结构化查询语言)指令
  8. 51nod 1565模糊搜索(FFT)
  9. 【算法】分块——教主的魔法&amp;不勤劳的图书管理员
  10. [LOJ#2553][CTSC2018]暴力写挂