bzoj1690:[Usaco2007 Dec]奶牛的旅行 (分数规划 && 二分 && spfa)
2024-09-06 21:02:50
用dfs优化的spfa判环很快啦
分数规划的题目啦
二分寻找最优值,用spfa判断能不能使 Σ(mid * t - p) > 0
最优的情况只能有一个环
因为如果有两个环,两个环都可以作为奶牛的行程,如果两个环单独计算的结果不一样,那么两个环中比值更大的才是最优解,如果结果一样,多算一个环就没有意义了。
代码如下
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = ; int f[N], x, y;
double mid;
struct Edge{
int p, t;
double w;
inline void change() {
w = mid * (double)t - f[p];
}
};
vector < Edge > G[N];
bool vis[N];
double dis[N]; bool spfa(const int &z){
vis[z] = true;
for(int i = ; i < G[z].size(); i++)
if (dis[G[z][i].p] > dis[z] + G[z][i].w) {
if (vis[G[z][i].p])
return true;
else {
dis[G[z][i].p] = dis[z] + G[z][i].w;
if (spfa(G[z][i].p))
return true;
}
}
vis[z] = false;
return false;
} inline bool judge(){
for (int i = ; i <= x; i++)
for (int j = ; j < G[i].size(); j++)
G[i][j].change();
memset(vis, , sizeof(vis));
memset(dis, , sizeof(dis));
for (int i = ; i <= x; i++)
if (spfa(i))
return true;
return false;
} int main() {
scanf("%d %d", &x, &y);
for (int i = ; i <= x; i++)
scanf("%d", &f[i]);
for (int i = ; i <= y; i++) {
int m, n, o;
scanf("%d %d %d", &m, &n, &o);
G[m].push_back((Edge) {n, o, });
}
double l = , r = ;
while (r - l > 0.000001) {
mid = (l + r) / ;
if (judge()) l = mid;
else r = mid;
}
printf("%.2lf", l);
return ;
}
最新文章
- FatMouse&#39;s Speed——J
- C#如果把A.new()编译成new A()
- protocol
- linux 冒号的用途
- makefile 学习(一)
- HTML5实现的视频播放器01
- 学IT技术 轻松高薪就业
- Java NIO Channel和Buffer
- [bzoj1500][NOI2005]维修数列——splay
- Windows Linux的cmd命令查询指定端口占用的进程并关闭
- Keras入门(二)模型的保存、读取及加载
- 手撕RPC框架
- CCF2016092火车购票
- [Unit Test] Unit Test Brief Introduction
- Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路
- centos 7 lsof 安装使用
- 如何在vs2008安装64位编译器
- 【转】Python格式化字符串str.format()
- Window窗口布局 --- DecorView浅析
- Oracle GoldenGate (ogg) 11.2.1.0.20 是最后一个支持oracle db 10g的 ogg版本号