题解:qoj7938 Graph Race

news/2025/10/18 19:35:50/文章来源:https://www.cnblogs.com/LUlululu1616/p/19150084

简单题。

题意:给出一张图,边权为 \(1\),每个点有属性 \(a,b\),定义一个点 \(u\) 的权值 \(f(u)\)\(\max _{u\not=v}a_v-b_v\operatorname{dis}(u,v)\),按从小到大的顺序输出与 \(1\) 相连的的点的 \(f\) 值。

做法:

首先观察到只需要输出与 \(1\) 相连的而不是任一点,说明这是有意义的。我们注意到,与 \(1\) 相连的点 \(u\),与其他 \(v\) 的距离 \(\operatorname{dis}(u,v)\)\(\operatorname{dis}(1,v)\) 相差不会超过 \(1\),所以可以直接讨论三者的贡献。

首先对于 \(\operatorname{dis}(1,v)+1\),因为这个是最差的可能,直接全部更新就可以了。

然后对于 \(\operatorname{dis}(1,v) - 1\)\(\operatorname{dis}(1,v)\),前者等于,我令 \(\operatorname{dis}(1,x)+1=\operatorname{dis}(1,y)\) 的这些边在新图上连一条 \(x\rightarrow y\) 的有向边,然后只能走这些有向边到达;后者等于我可以走一条 \(\operatorname{dis}(1,x)=\operatorname{dis}(1,y)\) 的边。

第一种边很好连,关键在于第二种我只能走一条,只能走一条这种限制很分层图,直接拆开就可以了。

记得要求 \(u\not=v\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 6e5 + 5;
int n, m, a[maxn], b[maxn], ans[maxn];
vector<int> e[maxn], g[maxn];
int dis[maxn];
void bfs(int s) {memset(dis, 0x3f, sizeof(dis));dis[s] = 0;queue<int> q; q.push(s);while(!q.empty()) {int u = q.front(); q.pop();for (int i = 0; i < e[u].size(); i++) {int v = e[u][i];if(dis[v] > dis[u] + 1) {dis[v] = dis[u] + 1;q.push(v);}}}
}
int vis[maxn], res[maxn];
struct node {int val, p;friend bool operator<(node x, node y) {return (x.val < y.val ? 1 : 0);}node() {val = -9e18, p = 0;}node(int V, int P) {val = V, p = P;}
} mx, smx;void dfs(int u) {if(vis[u])return ;vis[u] = 1;res[u] = a[u] - b[u] * dis[u];for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];dfs(v);ans[u] = max(ans[u], res[v]);}res[u] = max(res[u], ans[u]);
//	cout << u << " " << ans[u] << " " << res[u] << endl;
}
signed main() {cin >> n >> m;for (int i = 1; i <= n; i++)cin >> a[i] >> b[i];for (int i = 1; i <= m; i++) {int x, y; cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}bfs(1);memset(ans, -0x3f, sizeof(ans));for (int i = 1; i <= n; i++) {node t = node{a[i] - (dis[i] + 1) * b[i], i};if(smx < t)smx = t;if(mx < smx)swap(smx, mx);}
//	cout << mx.val << " " << mx.p << endl;for (int i = 1; i <= n; i++) {for (int j = 0; j < e[i].size(); j++) {int k = e[i][j];if(dis[i] + 1 == dis[k])g[i].push_back(k), g[i + n].push_back(n + k);else if(dis[i] == dis[k])g[i].push_back(k + n);}}for (int i = 1; i <= n; i++)dis[i + n] = dis[i], dis[i] = max(dis[i] - 1, 0ll),a[i + n] = a[i], b[i + n] = b[i];for (int i = 1; i <= 2 * n; i++)dfs(i);sort(e[1].begin(), e[1].end());for (int i = 0; i < e[1].size(); i++) {if(e[1][i] == mx.p)cout << max(smx.val, ans[e[1][i]]) << endl;elsecout << max(mx.val, ans[e[1][i]]) << endl;}return 0;
}
/*
3 3
1235 123
2152 242
324 31
1 2
2 3
3 1
*/

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

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

相关文章

java中的初等函数

java中的初等函数一、函数 基本初等函数:基本初等函数是指常值函数、幂函数、指数函数,对数函数、三角函数、反三角函数这六类函数。 初等函数:将由基本初等函数经过有限次加、减、乘、除四则运算和有限次复合运算所…

【机器人】SG-Nav 分层思维链H-CoT | 在线分层3D场景图 | 目标导航 - 教程

【机器人】SG-Nav 分层思维链H-CoT | 在线分层3D场景图 | 目标导航 - 教程2025-10-18 19:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: …

Dr. Jane Goodall

Dr. Jane Goodallwhen I was in gomi particularly I felt very very close to a great spiritual [Music] power if we think of the Bible it would be in which we live and move and have our being and I felt th…

专用硬件神经网络优化技术解析

本文深入探讨了针对专用硬件优化神经网络架构的技术方案,通过优化搜索空间设计和结合专家经验,在多个实际应用中实现了高达55%的延迟降低,涵盖了检测模型、分类模型和语义分割等具体应用场景。专用硬件神经网络优化…

学习逆向的背景知识(自用)

学习逆向的背景知识(自用) 常见的寄存器指令指针(程序计数器) IP EIP RIP 寄存下一个指令的地址通用寄存器:累加器寄存器 EAX RAX 寄存算术运算结果基址寄存器 EBX RBX 寄存引用偏移量的基址…

Linux-网络安全私房菜(二)

Linux-网络安全私房菜(二)目录防火墙防火墙简单操作iptablestips建议系统资源篇章理解数据流输出重定向stress压力测试命令free命令netstat命令ss命令软件包篇章rpm包管理dpkg包管理磁盘篇章MBRfdiskGPT(GUID)gdiskpar…

pycharm使用远程的ssh的解释器

今天使用了远程ssh的解释器1.使用 专业版本的pycharm 2. 3. 解释器使用 .conda/envs/.../lth/python.exe 4. 5. 如果你有一些数据集也在这附近,需要把数据集 exclude掉 总的来说, 这么做就够了。 可惜我老师只有…

Android SSL Pinning检测利器:SSLPinDetect技术解析

本文详细介绍了SSLPinDetect工具的技术原理和实现,这是一个用于Android应用安全分析的SSL Pinning检测工具,通过多线程扫描、内存映射读取和预编译正则表达式等技术,实现高效的静态代码分析。SSLPinDetect:Android…

AI元人文:社区调解的数字剧场

AI元人文:社区调解的数字剧场 在AI元人文的视野下,社区调解经历了一场深刻的范式转变——从对错的裁判转变为多方价值诉求在特定情境舞台上的创造性对话。这不仅是方法的升级,更是对调解本质的重新定义。 一、从对抗…

2025年粉末冶金制品/零件厂家推荐排行榜,专业制造与高品质服务的首选!

2025年粉末冶金制品/零件厂家推荐排行榜,专业制造与高品质服务的首选!随着工业技术的不断进步和市场需求的多样化,粉末冶金制品及零件在各个领域的应用越来越广泛。为了帮助采购决策者筛选出优质的粉末冶金制品及零…

详细介绍:【探寻C++之旅】第十六章:unordered系列的认识与模拟实现

详细介绍:【探寻C++之旅】第十六章:unordered系列的认识与模拟实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

Dubbo入门-Dubbo的快速使用

什么是Dubbo Dubbo是一个分布式、高性能、透明化的RPC服务框架。 提供服务自动注册、自动发现等高效的服务治理方案,可以和Spring框架无缝集成。 Dubbo中服务端最核心的对象:ApplicationConfig:配置当前应用信息 Pr…

15 接口的介绍

15 接口的介绍接口 专业的抽象 定义 只有规范,自己无法写方法 规范的含义是,定义规则,即‘若,则’这类规范。 如:如果你是老师,则你要具备教学生的能力。 使用 public interface Name1{//接口中的所有定义都是抽…

傅里叶变换及DCT点滴

上图来自 PDF Fourier Transforms and the Fast Fourier Transform (FFT) Algorithm, Paul Heckbert. 如果a_n都相等的话,A_k是等比数列求和. 为啥傅里叶变换在解密中也有用?因为解密涉及大整数的分解,which涉及一…

【未完待续】MkDocs 部署安装教程

MkDocs 简介MkDocs 是一个基于 Python 的 Markdown 的静态网站生成工具,常用于快速搭建项目文档网站。 它界面简洁大方,配置简单,生成速度快,特别适合技术手册、内部知识库等场景,并可部署到 Github Pages,因此深…

傅里叶变换点滴

上图来自 PDF Fourier Transforms and the Fast Fourier Transform (FFT) Algorithm, Paul Heckbert. 如果a_n都相等的话,A_k是等比数列求和. 为啥傅里叶变换在解密中也有用?因为解密涉及大整数的分解,which涉及一…

[PaperReading] SAIL-Embedding Technical Report: Omni-modal Embedding Foundation Model

目录SAIL-Embedding Technical Report: Omni-modal Embedding Foundation ModelTL;DRDataRecommendation-aware Data ConstructionDynamic Hard Negative MiningQ:动态难负样本挖掘是什么原理?\(\lambda^*\)是如何动…

How to Practice English Daily for 30 mins

How to Practice English Daily for 30 minsWelcome to Bookish English 2. Tell me honestly, how many times have you said, "Ill start learning English tomorrow." But tomorrow never comes, right?…

Flash 8.0下载安装

Flash 8.0下载安装https://www.yutu.cn/softhtml/softsetup_136.html