P6628 [省选联考 2020 B 卷] 丁香之路 题解

news/2024/11/13 17:02:40/文章来源:https://www.cnblogs.com/Rock-N-Roll/p/18544331

P6628 [省选联考 2020 B 卷] 丁香之路 题解

首先考虑题目中路径权值的含义:\(i,j\) 两点之间的最短路就是 \(|i-j|\) 直接连边。

题目要求从 \(s\) 遍历到每个点,到终点每个 \(x\) 的最短时间。于是我们不妨枚举每个 \(x\),考虑在 \(O(n)\)\(O(n\log n)\) 的时间复杂度里解决问题。

观察到题目的定义和欧拉回路的定义很相似。若加上 \((s,x)\) 的虚边,就是一个欧拉回路了。考虑欧拉回路的判定条件是所有点的度数都是偶数。于是我们的任务转变为了将存在的这些个奇度点通过连一些边的方式变成偶度点,同时要保证图联通。

偶度点的限制更不好处理一些,于是让我们先考虑偶度点的限制。在解决问题之前需要注意到本题中特殊权值带来的性质:对于 \(a,b\) 两点,最短路是 \(|a-b|\),于是不妨在 \(a,b\) 之间的每两个相邻的点之间都连一条边,这样不仅只改变了 \(a,b\) 点度数的奇偶性,还尽可能多地连通了连通块。

于是我们将所有奇度点排序为 \(a_1,a_2,a_3\cdots,a_n\),将 \(a_1,a_2;a_3,a_4\) 这样两两配对一定最优。对于连通性问题,首先容易发现的是上述的连边一定不劣,证明的话考虑无论如何奇度点会找到另一个奇度点配对,那对 \(a_1\),如果不找 \(a_2\),倘若找到 \(a_t\),那么这样更新的实质和 \(a_1\rightarrow a_2\rightarrow a_t\) 是一致的,依此类推地去考虑分析。那么现在的图都是偶度点,加一条边就必须加双向的。连边的原则仍然是尽量连相邻的边,于是将连续的两两不相邻的边加入最小生成树去跑即可。

时间复杂度的话是 \(O(n^2\log n)\) 的,瓶颈是最小生成树。

代码:

#include <bits/stdc++.h>
#define N 2505
#define int long long
using namespace std; 
int n, m, s;
int fa[N], fz[N];
int fnd(int x) {return x == fa[x] ? x : fa[x] = fnd(fa[x]);
}
void mge(int x, int y) {x = fnd(x), y = fnd(y);fa[x] = y;
}
int deg[N];
struct Node {int x, y, dis;bool operator < (const Node &a) const {return dis < a.dis;}
};
int ans, sum;signed main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m >> s;for (int i = 1; i <= n; i++)fa[i] = i;for (int i = 1; i <= m; i++) {int x, y;cin >> x >> y;deg[x]++, deg[y]++;sum += abs(x - y);mge(x, y);}for (int i = 1; i <= n; i++)fz[i] = fa[i];for (int i = 1; i <= n; i++) {deg[s]++;deg[i]++;ans = sum;for (int j = 1; j <= n; j++)fa[j] = fz[j];int t = 0;for (int j = 1; j <= n; j++)if (deg[j] & 1) {if (t) {for (int k = t; k < j; k++)mge(k, k + 1);ans += j - t;t = 0;}else t = j;}vector<int>p;for (int j = 1; j <= n; j++)if (deg[j]) p.push_back(j);int l = p.size();vector<Node>v;for (int j = 1; j < l; j++)if (fnd(p[j - 1]) != fnd(p[j]))v.push_back({p[j - 1], p[j], p[j] - p[j - 1]});sort(v.begin(), v.end());for (auto tmp : v)if (fnd(tmp.x) != fnd(tmp.y))ans += tmp.dis << 1ll, mge(tmp.x, tmp.y);cout << ans << " ";deg[s]--;deg[i]--;}return 0;
}

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

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

相关文章

GitLab 中文版如何禁止从 UI 上下载代码?

本文分享如何通过配置来禁止用户从 GitLab 中文版 UI 界面上下载源代码。 GitLab 中文版也就是极狐GitLab,使用界面和 GitLab 一样。常规下载代码的方式也一样,要么使用 SSH 或者 HTTP 克隆,要么直接从 UI 上下载源代码:但是有些企业不想让员工从这个界面上通过下载源代码的…

交换机

$Never\ Give\ Up$

在webstorm里面使用prettier

1. 安装 Prettier bash复制代码 npm install --save-dev prettier2. 创建 Prettier 配置文件 在项目根目录下创建一个 .prettierrc 文件来定义 Prettier 的代码风格规则。以下是一个简单的 Prettier 配置文件示例: json复制代码{"semi": false, // 不…

Delphi通过ODBC连接到GBase 8s数据库

Delphi通过ODBC连接到GBase 8s数据库作者: liaosnet时间: 2021-12-27分类: 默认分类,运维管理阅读:2615 次测试使用Delphi连接到GBase 8s数据库,使用的是ODBC连接方式。 1)、安装ODBC驱动(CSDK) 通过地址https://gbasedbt.com/dl/odbc/GBase8s_3.0.0_1-Win32-ODBC-Driver.z…

数据库查询第5到8行的数据

limit 4 表示要返回的行数为4 offset 4表示从结果集的第5行开始

CW 11.13 模拟赛 T3 大方和小方

算法 可以看出来是组合数学, 但是考场上时间不够 + 本身也没做过组合数学, 放弃了经过人类智慧的推导 由 \(\rm{Subtask} 1\) 可得基础柿子 令 $ a = b_2 - d_1 , b = a_2 - c_1 $ 插空法可知答案为 \(a + b \choose a\)代码 略 总结 注意组合数学的 \(\sum\) 有些时候可以化成…

NOIP 模拟赛:2024-11-11

T1:法一:\(O(n^2)\) 的 DP。\(dp[i][j][0/1]\) 表示在 \(i\) 的子树内染色,\(i\) 是红/黑,使得每个要求的结点的黑点个数都等于 \(j\)。 法二:\(O(n)\) 的神秘做法。取出最浅的被要求结点,把深度 \(\le\) 它的都染成黑色,其余点都染成红色。 T2: 对于一个元素属于 \([0…

[自用]ubuntu下kafka环境的搭建

首先安装了OpenJDK https://segmentfault.com/a/1190000044953489 没有配置默认的Jave版本 没有设置JAVA_HOME环境变量 补充:设置JAVE_HOME环境变量在图形界面中打开etc\environment文件,在其中追加JAVA_HOME变量(注意java版本和路径等的名称)保存后关闭,在终端里使用sour…

Java学习之定时任务框架Quartz

Quartz 的核心类有以下三部分:Job : 需要实现的任务类,实现 execute() 方法,执行后完成任务。Trigger : 包括 SimpleTrigger 和 CronTrigger。Scheduler : 任务调度器,负责基于 Trigger触发器,来执行 Job任务。 简单示例 1.pom配置 2.创建Jobpublic class EplJob imple…

比 Copilot 快两倍以上!在我的开源项目 AI Godot 桌宠中用通义灵码解决问题

Qwen 开源模型在开源榜单上大杀四方,所以不得心生几分好感,通义灵码底层基于 Qwen2.5 最新模型,代码补全和问答能力全面升级。本文作者:plzpj6bp7mjr4,内容选自通义灵码超级个体创新实践大赛,并对部分内容做了微调,感谢作者分享的最佳实践! 最近,阿里的开源大模型刷屏…

vue3开发扫雷游戏,支持调整难度,支持计时

闲来练习练习js,写了个扫雷游戏,直接拿去复制粘到自己本地某个html文件里就能运行,记得把vue加载地址改成线上的~~ 有空了可以再加上计分板 运行起来长下面这样 直接上代码1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset=…