[USACO07DEC] Sightseeing Cows G

news/2024/11/16 17:14:17/文章来源:https://www.cnblogs.com/YzaCsp/p/18549518

算法

初看题面没有思路, 考虑使用数学语言表示

注意本题最重要的信息是发现路径为一个环

给你一张 \(n\)\(m\) 边的有向图,第 \(i\) 个点点权为 \(F_i\) , 第 \(i\) 条边边权为 \(T_i\)

找一个环, 设环上的点组成的集合为 \(S\) , 环的边组成的集合为 \(E\) , 令

\[\frac{\sum_{u\in S}F_u}{\sum_{e\in E}T_e} \to max \]


这个形式与 \(0\)/\(1\) 分数规划很相似

考虑 \(0\)/\(1\) 分数规划的方式

\[\frac{ \sum_{u \in S} F_us_u} {\sum_{e\in E}T_es_u} \geq x \]

移项得,

\[f = \sum_{u \in S, e \in E} (F_u - xT_e)s_u \geq 0 \]

现在我们可以将图中的边权化为 \(F_u - xT_e\) , 然后只需要找到一个环, 看路径总长度是否大于 \(0\) , 二分是显然的

观察到这是一个典型的 \(\rm{spfa}\) 找正环的问题, 于是就可以打代码了

代码

实现上, 这里有一个类似于 \(\rm{Tarjan}\) 算法的问题, 边连接着两个点, 我们不好去判断 \(F_u, T_e\) 怎么改变边的权值

对于环, 我们只需要记录当前点出去的边为 \(T_e\) 即可, 反正最后会绕回去

所以也就简单了

#include <bits/stdc++.h>
#define int long long
const int MAXM = 5e3 + 1145;
const int MAXN = 1e3 + 30;
const double eps = 1e-5;int n, m;
int Val[MAXN];class Graph_Class
{
private:public:struct node{int to; double w;int next;} Edge[MAXM];int Edge_Cnt = 0;int head[MAXN];void head_init() { for (int i = 0; i <= n; i++) { head[i] = -1; } }void init(){ head_init(); }void addedge(int u, int v, double w) {Edge[++Edge_Cnt].to = v;Edge[Edge_Cnt].w = w;Edge[Edge_Cnt].next = head[u];head[u] = Edge_Cnt;}
} Graph;class Sol_Class
{
private:double dis[MAXN];int vis[MAXN];bool inq[MAXN];std::queue<int> Q;void init() {memset(dis, -0x3f, sizeof(dis));memset(vis, 0, sizeof(vis));while (!Q.empty()) Q.pop();memset(inq, false, sizeof(inq));}bool spfa(int Start, double x){init();Q.push(Start), dis[Start] = 0, vis[Start]++, inq[Start] = true;while (!Q.empty()){int Now = Q.front();Q.pop();inq[Now] = false;for (int i = Graph.head[Now]; ~i; i = Graph.Edge[i].next) {int NowTo = Graph.Edge[i].to;double NowW = Val[Now] * 1.0 - x * Graph.Edge[i].w;if (dis[NowTo] < dis[Now] + NowW) {dis[NowTo] = dis[Now] + NowW;if (!inq[NowTo]) {inq[NowTo] = true;Q.push(NowTo);vis[NowTo]++;if (vis[NowTo] > n) return true;}}}}return false;}/*只需要判断是否有正环即可, 有就可以返回 true*/bool check(double x) {return spfa(0, x);}public:void solve(){double Left = 0, Right = 1024;double ans = -1;while (Right - Left > eps) {double Mid = Left + (Right - Left) / 2;if (check(Mid)) ans = Mid, Left = Mid;else Right = Mid;}printf("%.2lf", ans);}
} Sol;signed main()
{scanf("%lld %lld", &n, &m);Graph.init();for (int i = 1; i <= n; i++)scanf("%lld", &Val[i]);for (int i = 1; i <= m; i++) {int u, v, w;scanf("%lld %lld %lld", &u, &v, &w);Graph.addedge(u, v, w);}/*建立超级源点*/for (int i = 1; i <= n; i++)Graph.addedge(0, i, 0);Sol.solve();return 0;
}

总结

初看题面没有思路, 考虑使用数学语言表示

注意超级源点会使 \(MAXM\) 变大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222315 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1、实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search…

20222315 2024-2025-1 《网络与系统攻防实验六实验》实验六实验报告

1、实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search…

《Django 5 By Example》阅读笔记:p165-p210

《Django 5 By Example》学习第6天,p165-p210总结,总计46页。 一、技术总结 1.bookmarks项目 (1)登录认证 作者这里使用的是Django自带的auth。 (2)上传头像 图片处理,使用Pillow。 (3)扩展user 扩展user模型与自带的user使用外键进行关联,命名为profile。 二、英语总结(生…

记录---nextTick用过吗?讲一讲实现思路吧

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣源码实现思路(面试高分回答) 📖 面试官问我 Vue 的 nextTick 原理是怎么实现的,我这样回答: 在调用 this.$nextTick(cb) 之前:存在一个 callbacks 数组,用于存放所有的 cb 回调函数。 存在一个 flushCallbacks 函…

AI|经常崩溃的问题解决

Adobe Illustrator Crashes 网络上大部分说法都是重装AI,兼容性问题,管理员权限或者是版本不对,经测试均无效,甚至出现重装系统这种离谱的办法,正确的解决办法是把首选项的性能里的GPU取消勾选,或者再把电脑的虚拟内存扩大即可。Step1:打开首选项 Step 2:取消勾选GPU性…

吐槽ubuntu上pdf阅读器

! https://zhuanlan.zhihu.com/p/6483861108 细数(吐槽)ubuntu(linux)上pdf阅读器不好用的地方 作为一枚研究僧,有使用ubuntu(linux)的需求,同时也有在ubuntu上看学术文献的需求(毕竟有时候懒得切换回windows)。对于pdf学术文献阅读,最需要功能是高亮、点击跳转、(跳转后)返…

数据采集与融合技术作业4

Gitee作业链接:https://gitee.com/zheng-qijian33/crawl_project/tree/master/作业4 作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的…

书生共学大模型实战营第4期 L1G4000任务提交

基于LlamaIndex构建自己的RAG知识库,寻找一个问题A在使用LlamaIndex之前浦语API不会回答,借助LlamaIndex后浦语API具备回答A的能力 我们选择了一个名为wereader的Github小众项目,这是一个Chrome/Firefox扩展,主要用于微信读书做笔记,对常使用Markdown做笔记的读者比较有帮…

Springboot 集成Apollo配置中心【记录】

一、前言 ​ 我们经常会在Springboot项目中集成配置中心,无外乎是因为配置中心即时改即时生效的缘故。而我选择Apollo的原因,是因为它有个草稿、然后发布的功能,这在上生产发布前,提前配置好变更项,检查通过再发布,这种机制对于我们来说可太友好了!二、步骤 2.1 pom.xm…

JUC---ThreadLocal原理详解

什么是ThreadLocal? 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类…

一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制

一、背景 数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况慢时钟向快时钟同步:只需在快时钟域打两拍即可。其RTL如下:打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打拍可以有效得避免亚稳态,而且一般要打两拍,其数学本质是如果打一拍发生错误得概…

KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸

KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸编辑:ll KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸 型号:KBPC3510 品牌:ASEMI 封装:KBPC-4 正向电流:35A 反向电压:1000V 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 漏电流:>10ua 恢复时间:>2000ns 浪涌电流:…