题意:给出一个有向图,问求一个回路,使得回路上的点权之和/边权之和最大。

这题主要是分析出如何确定ans值。我们将(a1*x1+a2*x2+..+an*xn)/(b1*x1+b2*x2+..+bn*xn)=L,转换为:x1*(a1-b1*L)+x2*(a2-b2*L)+...xn*(an-bn*L)=0

则每次枚举L的值,spfa中边权值为len[]*L-a[],若存在负环回路(即一个点访问次数超过n次)则表示L的值小了,增大L值;反之减小L值.

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 1052
#define inf 10000000
using namespace std;
struct Edge{
int u,len,next;
}edge[5*MAXN];
int temp,n,m;
int head[MAXN],a[MAXN];
void addEdge(int u,int v,int c)
{
edge[temp].u=v;
edge[temp].len=c;
edge[temp].next=head[u];
head[u]=temp;
temp++;
}
double dis[MAXN];
bool vis[MAXN];
int num[MAXN];
int que[MAXN*MAXN];
bool spfa(double mid)
{
double val;
for(int i=0;i<=n;i++)
{
dis[i]=inf;
vis[i]=false;
num[i]=0;
}
dis[1]=0; int headt,tail;
headt=0;tail=0;
que[tail++]=1;
vis[1]=true;
num[1]++;
while(headt!=tail)
{
int v=que[headt];
headt++;
vis[v]=false;
for(int i=head[v];i!=-1;i=edge[i].next)
{
int u=edge[i].u;
val=mid*edge[i].len-a[u];
if(dis[v]+val<dis[u])
{
dis[u]=dis[v]+val;
if(!vis[u])
{
que[tail++]=u;
vis[u]=true;
num[u]++;
if(num[u]>=n)
{
return false;
}
}
}
}
}
return true;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
temp=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
int v,w,c;
scanf("%d%d%d",&v,&w,&c);
addEdge(v,w,c);
}
double mid=0;double ans=0;
double l=0;double r=2000;
while(r-l>=0.001)
{
mid=(l+r)/2.0; if(spfa(mid))
{
r=mid; //减小ans;
}
else
{
ans=mid;
l=mid;
}
}
printf("%.2lf\n",ans); }
return 0;
}

poj 3621 二分+spfa的更多相关文章

  1. poj 3621 二分+spfa判负环

    http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...

  2. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】

    题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total ...

  3. POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10306   Accepted: 3519 ...

  4. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

  5. UVALive 4223 Trucking 二分+spfa

    Trucking 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8& ...

  6. POJ - 2018 二分+单调子段和

    依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...

  7. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  8. POJ 3662 (二分+SPFA

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8856   Accepted: 3211 D ...

  9. Telephone Lines POJ - 3662 (二分+spfa)

    Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...

随机推荐

  1. 简单工厂设计模式--Java设计模式(一)

    一 概念: 简单工厂模式就是通过一个工厂类根据参数动态创建对应的类. 二 案例 我们以汽车作为例子,在现实生活中汽车只是一个抽象的产品,其中有很多类型的汽车才是具体产品,如奔驰.宝马.保时捷等等(当然 ...

  2. Solr(四)Solr实现简单的类似百度搜索高亮功能-1.配置Ik分词器

    配置Ik分词器 一 效果图 二 实现此功能需要添加分词器,在这里使用比较主流的IK分词器. 1 没有配置IK分词器,用solr自带的text分词它会把一句话分成单个的字. 2 配置IK分词器,的话它会 ...

  3. Java集合框架Collections【List/Set】

    1.基本介绍: 集合就是存放对象的,他比数组好的一点就是他一开始不清楚自己长度 容器一般是分为很多种的,很多的容器在一起然后进过断的抽象和抽取就成了一个体系,我们称之为集合框架 我们看体系首先是看顶层 ...

  4. swift UILabel多行显示时 计算UILable的高度(可用于UILable高度自适应)

    代码如下 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = ...

  5. 让你的Dapper像EF一样调用 开源~!

    什么是Dapper? Dapper是一款轻量级的ORM框架,大名鼎鼎! 由谷歌Google 开发,在N款orm框架中 效率是最快的 最高的! 经过数据测试 比EF快 12-20 倍 国外最大的技术网站 ...

  6. 数据库db2错误代码大全

    sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 ...

  7. C#之隐式与显示类型转换

    今天在看一篇有关数据类型的文章的时候,无意间看到了两个关键词,"隐式转换"与"显示转换",然后突然想起了当初开始学编程的时候,也总是在代码编译的时候遇到这样的问 ...

  8. 【算法与数据结构】Java实现字符串的全排列及组合

    注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾. 一.字符串的全排列问题 1. 下面是最初的代码(答案有错误-重复输出) import java.util.Scanner; pu ...

  9. LINUX系统自动化部署shell脚本

    #!/bin/shsudo /etc/init.d/tomcatstopwaitsudo rm -rf /opt/tomcat7/work/*waitsudo rm -rf /opt/tomcat7/ ...

  10. window/mac系统关机

    window/mac系统关机 #ifdef Q_OS_WIN #include "windows.h" #endif void OnShutDown() { #ifdef Q_OS ...