用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 ;
}

最新文章

  1. FatMouse&#39;s Speed——J
  2. C#如果把A.new()编译成new A()
  3. protocol
  4. linux 冒号的用途
  5. makefile 学习(一)
  6. HTML5实现的视频播放器01
  7. 学IT技术 轻松高薪就业
  8. Java NIO Channel和Buffer
  9. [bzoj1500][NOI2005]维修数列——splay
  10. Windows Linux的cmd命令查询指定端口占用的进程并关闭
  11. Keras入门(二)模型的保存、读取及加载
  12. 手撕RPC框架
  13. CCF2016092火车购票
  14. [Unit Test] Unit Test Brief Introduction
  15. Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路
  16. centos 7 lsof 安装使用
  17. 如何在vs2008安装64位编译器
  18. 【转】Python格式化字符串str.format()
  19. Window窗口布局 --- DecorView浅析
  20. Oracle GoldenGate (ogg) 11.2.1.0.20 是最后一个支持oracle db 10g的 ogg版本号

热门文章

  1. 使用SFTP连接Centos
  2. Aspcms标签大全及常用标签
  3. sql注入文件写入和读取
  4. H5-IOS能否自动弹出软键盘
  5. sql server针对字符串型数字排序(针对此字符串的长度不一致)
  6. 转: OSIP协议栈使用入门
  7. Java参数传递是值传递还是引用传递?
  8. 关于2008R2的序列号
  9. 2_abstractions
  10. babel 的简单使用