Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
题面
题解(0/1分数规划+spfa)
考虑$0/1$分数规划,设当前枚举到的答案为$ans$
则我们要使(其中$\forall b_i=1$)
$$
\frac{\sum_{i=1}ta[e_i]}{\sum_{i=1}tb[v_i]}< ans
\ \therefore\sum a[e_i]-ans*b[v_i]=\sum a[e_i]-ans<0
$$
则问题就变成了判断图内是否存在一个负环...
时间复杂度:$O(nmlog)$
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min; using std::max;
using std::swap; using std::sort;
typedef long long ll;
template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
}
const int N = 3e3 + 10, M = 1e4 + 10;
const double eps = 1e-9;
int n, m, from[N], cnt, to[M], nxt[M]; double dis[M];
inline void addEdge(int u, int v, double w) {
to[++cnt] = v, nxt[cnt] = from[u], dis[cnt] = w, from[u] = cnt;
}
double p[N]; bool vis[N], flag;
void spfa(int u, double k) {
vis[u] = 1;
for(int i = from[u]; i; i = nxt[i]) {
if(flag) return ;
int v = to[i]; double w = dis[i] - k;
if(p[v] > p[u] + w) {
if(vis[v]) return (void)(flag = 1);
p[v] = p[u] + w, spfa(v, k);
}
}
vis[u] = 0;
}
int main () {
read(n), read(m); int u, v; double w;
for(int i = 1; i <= m; ++i)
read(u), read(v), scanf("%lf", &w), addEdge(u, v, w);
double l = -1e7, r = 1e7, ret;
while(r - l > eps) {
double mid = l + (r - l) / 2.;
memset(p, 0, sizeof p), memset(vis, 0, sizeof vis);
flag = 0;
for(int i = 1; i <= n; ++i) {
spfa(i, mid); if(flag) break;
}
if(flag) ret = mid, r = mid - eps;
else l = mid + eps;
} printf("%.8lf\n", ret);
return 0;
}
题解(动态规划+结论)
显然,如果真的将渐进复杂度卡满的话(甚至卡到指数级),你是过不去的,这里讲一下这题真正意义上的正解(貌似出这道题的本意就是考察$0/1$分数规划)。
为什么说是结论呢?根据Karp在1977年的论文,他讲述了一种$O(nm)$的算法,用来求有向强连通图中最小平均权值回路,也就是这题的模型。具体可以去看$_rqy$的博客
我们新建一个节点,从它到每个点连一条权值任意的边(比如都是$0$),再令$F_j(i)$表示从新建的点到$i$点恰好经过$j$条边的最短路,那么有
$$
ans=\min_{1\leq i\leq n, F_{n+1}(i)\neq\infty}\max_{j=1}^{n}\left[\frac{F_{n+1}(v)-F_k(v)}{n+1-k}\right]
$$
求$f$可以用动态规划来求,之后就是套公式了。
但是啊,在$Bzoj$上是过不去的,空间只有$64MB$,可以用滚动数组进行优化。
Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)的更多相关文章
- 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)
传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...
- 【POJ3621】【洛谷2868】Sightseeing Cows(分数规划)
[POJ3621][洛谷2868]Sightseeing Cows(分数规划) 题面 Vjudge 洛谷 大意: 在有向图图中选出一个环,使得这个环的点权\(/\)边权最大 题解 分数规划 二分答案之 ...
- 【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)
题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除 ...
- BZOJ1486 HNOI2009 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
- 【洛谷P2494】 [SDOI2011]保密(分数规划+最小割)
洛谷 题意: 题意好绕好绕...不想写了. 思路: 首先类似于分数规划做法,二分答案得到到每个点的最小危险度. 然后就是在一个二分图中,两边撤掉最少的点(相应代价为上面算出的危险度)及相应边,使得中间 ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
- 【bzoj1486】[HNOI2009]最小圈 分数规划+Spfa
题目描述 样例输入 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 样例输出 3.66666667 题解 分数规划+Spfa判负环 二分答案mid,并将所有边权减去mid,然后再判 ...
- [HNOI2009]最小圈 分数规划 spfa判负环
[HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...
随机推荐
- pythonweb框架
https://www.cnblogs.com/sss4/p/8097653.html
- shell 25个常用命令
1.列出所有目录使用量,并按大小排序. ls|xargs du -h|sort -rn #不递归下级目录使用du -sh 2.查看文件排除以#开关和空白行,适合查看配置文件. egrep -v ...
- 【20151105noip膜你赛】bzoj3652 bzoj3653
题目仿佛在讽刺我... 第一题: 题解: 考虑枚举区间右端点,维护所以左到当前的 and 和 or .注意 and 每次变化至少有一个二进制位从1变 0,or 每次至少有一个位从0变 1,所以最多有l ...
- 【BZOJ1043】下落的圆盘 [计算几何]
下落的圆盘 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可 ...
- MVC4 AspNet MVC下的Ajax / 使用JQuery做相关的Ajax请求
源码参考:链接:http://pan.baidu.com/s/1pKhHHMj 密码:mkr4 1:新建-->项目-->Web-->ASP.NET MVC 4 Web 应用程序.命 ...
- bzoj 1406 数论
首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...
- 《Linux内核原理与设计》第十一周作业 ShellShock攻击实验
<Linux内核原理与设计>第十一周作业 ShellShock攻击实验 分组: 和20179215袁琳完成实验及博客攥写 实验内容: Bash中发现了一个严重漏洞shellshock, ...
- 【EverydaySport】健身笔记——背部训练
背部训练大致可以分为两种. 1 下拉式动作 躯干纵向上下位移的动作 典型代表 这样的下拉类动作 针对的是背阔肌 也就是两边像翅膀一样的部分 2 垂直于躯干的方向作用 向内拉 主要针对的是,背部的中部 ...
- sicily 1009. Mersenne Composite N
Description One of the world-wide cooperative computing tasks is the "Grand Internet Mersenne P ...
- 使用Webpack搭建Vue项目
前提: 1. 借助Node.js环境里的npm来安装, 2. 设置好npm镜像, (比如淘宝的npm镜像:输入 引用 npm install -g cnpm –registry=https://r ...