poj 3621 二分+spfa
题意:给出一个有向图,问求一个回路,使得回路上的点权之和/边权之和最大。
这题主要是分析出如何确定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的更多相关文章
- poj 3621 二分+spfa判负环
http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...
- POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
题目链接:http://poj.org/problem?id=3621 Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total ...
- POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10306 Accepted: 3519 ...
- poj 2049(二分+spfa判负环)
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...
- UVALive 4223 Trucking 二分+spfa
Trucking 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8& ...
- POJ - 2018 二分+单调子段和
依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...
- 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...
- POJ 3662 (二分+SPFA
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8856 Accepted: 3211 D ...
- Telephone Lines POJ - 3662 (二分+spfa)
Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...
随机推荐
- 利用python发送邮件
找了很多使用python发送邮件的文章, 发现写的并不是太全, 导致坑特别多, 刚把这个坑跨过去, 在此记录下来 本代码使用163作为发送客户端, 接收邮箱随意 首先登录163邮箱, 开启POP3/S ...
- java_弹球小游戏
弹球游戏实现原理: 隔一定时间(小于1秒)重新绘制图像,因为Graphics类是一个抽象类,创建子类的时候需要把所有涉及的方法都得重写,所以这里使用的是创建Canvas的子类,只需要重写它的paint ...
- OpenCV 之 Mat 类
以前看 OpenCV 的书,或者资料也好,遇到 Mat 类的介绍,一般都是匆匆带过,自以为已经很熟悉了,从来没有深入研究过. 结果前段时间面试了一家公司,被问到两个 Mat 的问题:一是,谈谈对 Ma ...
- akoj-1369 贪吃蛇
贪吃蛇 Time Limit:1000MS Memory Limit:65536K Total Submit:9 Accepted:2 Description 有童年的孩子都玩过这个经典游戏,不过这里 ...
- Hibernate中HQL函数汇总及获取当前时间进行比较举例
在很多时候,我们负责的项目中,在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,通常的原因是:我们使用了标准的sql语句,开启的确是hiberna ...
- Angular 小试牛刀[1]:Getting Started
首先,Angular2 与 Angular1.x 版本没有多大关系,甚至可以说是两个完全不一样的框架,故 Angular 指的是 Angular2 及以上的版本.而 Angular 与 TypeScr ...
- 函数&闭包
作用域链 闭包的理解 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 下面来看一个例子: function ...
- Markdown简明教程
一.Markdown到底是什么? Markdown是一种轻量级的标记语言,它使用很少量的符号控制文字的样式和排版,简单易学,使你更专注于文字. 二.Markdown的使用 接下来让我们一起来看下Mar ...
- 验证码的Java实现--jsp
<%@ page language="java" pageEncoding="UTF-8" %> <%@ page contentType=& ...
- xhost和DISPLAY
xhost是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显示 ...