SSL 2672_题目_spfa

题目描述

小C旅行到了美丽的x市。热爱oi的小C把x市分成了n个建筑物和m条双向街道,每一条街道都有一个通过时间,每个建筑物都有一个观赏值v。接着小C就在想了,如果我从任意一个点出发,经过至少两个点(包括出发点)后回到出发点,那么我能得到的最大平均观赏值是多少。平均观赏值指的是总观赏值/总耗费时间。你可以理解成观赏是不需要耗费时间的,且若多次到达同一建筑物,观赏值只会被计算一次。但小C还要和他的好朋友们开黑打农药,于是他就把这个又简单又无聊的问题交给了准备参加NOIP的你。


思路

用val表示观赏值,cost表示花费

题目让我们求出 $\frac{\sum{val}}{\sum{cost}} = ans$ 并使ans最大

我们可以将这个进行变形为 $\sum{val} - ans * \sum{cost} = 0$

那么我们可以二分ans并计算什么时候离0最接近,如果我们找到了一个负环,我们就让r向mid逼近

如果找到了一个正环我们就让l逼近并更新ans

这里用spfa来判断环的存在就可以了


#include <stdio.h>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
#define fill(x, y) memset(x, y, sizeof(x))
#define maxn 1001
#define maxm 5001
#define INF 0x7f7f7f7f
struct edge
{
    int to, w, next;
}e[maxm];
int ls[maxm], a[maxn], n, m, tot[maxn];
double state[maxn], mid;
bool fl[maxn], exits[maxn];
int spfa(int x)
{
    fill(state, -INF);
    fill(exits, 0);
    fill(tot, 0);
    queue<int> t;
    t.push(x);
    exits[x] = 1;
    fl[x] = 1;
    state[x] = 0;
    while (!t.empty())
    {
        int now = t.front();
        t.pop();
        for (int i = ls[now]; i; i = e[i].next)
        {
            double tt = a[e[i].to] - mid * e[i].w;
            if (state[e[i].to] < state[now] + tt)
            {
                state[e[i].to] = state[now] + tt;
                tot[e[i].to]++;
                if (tot[e[i].to] > n) return true;
                if (!exits[e[i].to])
                {
                    exits[e[i].to] = 1;
                    fl[e[i].to] = 1;
                    t.push(e[i].to);
                }
            }
        }
        exits[now] = 0;
    }
    return false;
}
int check()
{
    fill(fl, 0);
    for (int i = 1; i <= n; i++)
    {
        if (!fl[i])
        {
            if (spfa(i))
                return true;
        }
    }
    return false;
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        e[i] = (edge) {y, z, ls[x]};
        ls[x] = i;
    }
    double l = 0.0, r = 1000.0, ans = 0.0;
    mid = (l + r) / 2.0;
    while (r - l > 1e-5)
    {
        if (check())
        {
            ans = mid; l = mid + 1e-3;
        }
        else r = mid - 1e-3;
        mid = (l + r) / 2.0;
    }
    printf("%.2f\n", ans);
}
时间: 2024-08-08 22:38:07

SSL 2672_题目_spfa的相关文章

SSL 2677_飞行_spfa

题目描述 有n个城市,编号为0到n-1.小B想从城市s到城市t.他们选择了一家航空公司,这家公司有m种航线,每种航线连接了两个不同的城市.看在小B是个妹子的份上,航空公司的老总给了小B一点优惠:小B可以免费在最多k种航线上搭乘飞机.问小B最小花费是多少. 思路 在普通的spfa上多加一维, state[i][j]表示从起点到i点用了j此免费的最小花费,转移显然 在spfa时多枚举一个j即可 #include <stdio.h> #include <string> #include

有关SSL证书的一些事儿

随着网络安全形势越来越严峻,整个互联网界似乎已经达成了共识:那就是尽一切可能提高网站的安全性.安全技术有很多,其中SSL/TLS非对称加密技术及对应的PKI公钥架构体系又是最重要的技术之一.由于其技术分支较为复杂,这里仅就几个知识点做一下展开,以期帮助读者更好的理解SSL.     给网站申请https证书的过程是怎样的? 在展开这个题目之前,先回顾一下PKI架构.user, server, CA,这三者是PKI中的三个角色.user方接收到server发出的证书,并通过user自身客户端(浏览

java面试笔试基础题目

JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父

SSL 2731_村通网_最小生成树

题目描述 为了加快社会主义现代化,建设学校,小明决定给学校里每台电脑都连上互联网,方便未来随时随地玩耍. 他的电脑室很大,有N 台电脑,但地理位置偏僻,网络信号很差. 一台电脑有网,当且仅当满足以下至少一个条件: 1.给中国移动交宽带费,直接连网,花费为A. 2.向另外一台有网的电脑,安装共享网线,花费为B×两者曼哈顿距离. 现在,小明已经统计出了所有电脑的坐标.他想知道最少要多少费用才能达到目的. 思路 将全部点相连,边权为两点的两者曼哈顿距离*B 在用一个点i'和全部点相连全职为A 跑最小生

2012-10-9杭州阿里巴巴研发笔试题目

1.参考答案:C. 2.参考答案:D. 解析:对于8位二进制数,对于一个负数,|原码| + 补码 = 1 0000 0000, 所以如果求补码 = 1 0000 0000 - |原码|同理,对于4位三进制数,对于一个负数,|原码| + 补码 = 1 0000, 所以如果求补码 = 1 0000 - |原码|对于这道题,|-10|三进制为0101,则其补码 = 1 0000 - 0101 = 2122, 所以选D 3.参考答案:A. 4.参考答案:B. 解析:假设进程为A.B.C,最大可申请的资源

全面分析RHCE7(红帽认证工程师)考试题目之 ----WEB 服务器 篇

HTTP服务基础 独立Web服务 Web通信基本概念 基于B/S 服务端提供网页 浏览器下载并显示网页 Hyper Text Markup Language (HTML)超文本标记语言 Hyper Text Transfer Protocol(http)超文本传输协议 RHEL7中的Web服务 软件包:httpd 系统服务:httpd 提供的默认配置 Listen:监听地址:端口(80) ServerName:本站点注册的DNS名称 DcocumentRoot:网页根目录(/var/www/ht

Java开发面试题归类( 题目篇)

准备根据面试题来系统把知识点归纳总结学习一下,先将题目罗列出来! 一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4. 描述一下ArrayList和LinkedList各自实现和区别 5. Java中的队列都有哪些,有什么区别. 6. 反射中,Class.forName和classloader的区别 7. Java7.Java8的新特性(bai

MySQL 警告WARN: Establishing SSL connection without server&#39;s identity verification is not recommended.解决办法

Success loading Mysql Driver!Mon Apr 04 15:43:00 CST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by d

四则运算题目生成程序

a.需求分析 看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习.练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 =