题目链接:

id=3621">http://poj.org/problem?id=3621

在一个有向图中选一个环,使得环上的点权和除以边权和最大。求这个比值。

经典的分数规划问题,我认为这两篇题解写得非常清楚,能够參考一下http://blog.csdn.net/gengmingrui/article/details/47443705http://blog.csdn.net/wall_f/article/details/8221807

个人认为01分数规划差点儿都是二分或者迭代比值,从而找到一个最优解,使得原来的函数值等于0

#include<cstdio>
#include<cstring>
#include<queue>
#define eps 1e-3
#define MAXN 1010
using namespace std;
struct T
{
int v;
int w;
int next;
}edge[5005];
int cnt,head[MAXN];
void add_edge(int u,int v,int w)
{
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int n,m;
int w[MAXN];
double dis[MAXN];
bool inque[MAXN];
int vis[MAXN];
bool SPFA(double R)//SPFA推断负权环
{
queue<int> myque;
memset(inque,0,sizeof inque);
memset(vis,0,sizeof vis);
for(int i = 1; i <= n; i++)
dis[i] = 1e15;
myque.push(1);
dis[1] = 0;
inque[1] = 1;
vis[1]++;
while(!myque.empty())
{
int u = myque.front();
myque.pop();
inque[u] = 0;
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
int y = edge[i].w;
if(dis[u] + R*y - w[u] < dis[v])
{
dis[v] = dis[u] + R*y - w[u];
if(!inque[v])
{
myque.push(v);
inque[v] = 1;
vis[v]++;
if(vis[v] > n) return 1;
}
}
}
}
return 0;
}
int main()
{
memset(head,-1,sizeof head);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
scanf("%d",&w[i]);
for(int i = 1; i <= m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
double l = 0,r = 10000,mid;
while(r - l > eps)
{
mid = (l+r)/2;
if(SPFA(mid)) l = mid;//因为我们是把权值取反了的。因此题解中的R过大变成了R过小
else r = mid;
}
printf("%.2lf\n",l);
return 0;
}

最新文章

  1. python之最强王者(9)——函数
  2. javascript中this
  3. Swift 1.0: missing argument label &#39;xxx&#39; in call
  4. 在html里添加视频的方法
  5. java实现音频转换
  6. CentOS对新加入的硬盘格式化
  7. VS2012编译Snmp++ v3.2.25
  8. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(一)
  9. 查看电脑已安装的Jdk的位数
  10. C++虚成员函数表vtable
  11. C++编程练习(5)----“实现简单的循环队列的顺序存储结构“
  12. bitset基础用法+心得
  13. java基础(5)----面向对象
  14. 分布式缓存组件Hazelcast
  15. css书写规范以及如何写出赏心悦目的代码
  16. ML.NET 示例:深度学习之集成TensorFlow
  17. web攻擊
  18. WEB前端面试2014阿里旺旺
  19. byte类型的127+1=-128?
  20. HDFS Lease Recovey 和 Block Recovery

热门文章

  1. 搭建公司内部的NuGet服务器
  2. RabbitMQ之Helloworld
  3. [转]结合HierarchyViewer和APK文件反编译获得APP元素id值
  4. jquery.uploadify+spring mvc实现上传图片
  5. php条件语句(二)
  6. C#开发Windows窗体应用程序的步骤
  7. python并发编程之多进程一
  8. netty源码分析
  9. Spring Cloud Feign 整合 Hystrix
  10. php中session 入库的实现