P6348 [PA2011] Journeys 题解

题目

此题要用线段树优化建图写,这里顺便讲解一下线段树优化建图。

如果我们要从一张图的一个节点向另外 k k k 个节点连边:

在这里插入图片描述

那么如果我们要执行 2 ⋅ 1 0 5 2 \cdot 10^5 2105 次这样的操作,每一次都要连 1 0 5 10^5 105 条边,阁下又将如何应对?

如果我们在线段树上连边:

在这里插入图片描述

这样就只用连 log ⁡ ( N ) \log(N) log(N) 条边。

如果我们要从一个区间向一个点连边呢?

多建一棵树,要进行最短路操作就从另外一棵树开始(我们称之为出树,另外一棵为入树)。
在这里插入图片描述

这样就成功地从 3 , 4 3,4 3,4 节点向 1 1 1 节点连了一条边。

如果要区间向区间连边,就多建一个虚点,就可以了。

此题就是区间向区间连边,跑最短路就可以了。

注意:线段树上的边没有边权!

AC Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
int n, q, s;
struct edge{int u, v, nxt;int w;
};
edge ed[16000100];
int edcnt, head[16000100];
void add_edge(int u, int v, int w) {edcnt++;ed[edcnt].u = u;ed[edcnt].v = v;ed[edcnt].w = w;ed[edcnt].nxt = head[u];head[u] = edcnt;
}
struct node{int l, r;
};
node t[10000100];
int pos[10000100];
void make_in_tree(int l, int r, int p) {t[p].l = l;t[p].r = r;if (l < r) {make_in_tree(l, (l + r) / 2, p * 2);make_in_tree((l + r) / 2 + 1, r, p * 2 + 1);add_edge(p, p * 2, 0);add_edge(p, p * 2 + 1, 0);}else {pos[l] = p;add_edge(p, p + n * 8, 0);add_edge(p + n * 8, p, 0);}
}
void make_out_tree(int l, int r, int p) {if (p != 1) add_edge(p + n * 8, p / 2 + n * 8, 0);if (l < r) {make_out_tree(l, (l + r) / 2, p * 2);make_out_tree((l + r) / 2 + 1, r, p * 2 + 1);}
}
void add_in_tree_edge(int l, int r, int p, int u, int w) {if (l <= t[p].l && t[p].r <= r) {add_edge(p + n * 8, u, w);return;}if (l <= (t[p].l + t[p].r) / 2) add_in_tree_edge(l, r, p * 2, u, w);if (r > (t[p].l + t[p].r) / 2) add_in_tree_edge(l, r, p * 2 + 1, u, w);
}
void add_out_tree_edge(int l, int r, int p, int u, int w) {if (l <= t[p].l && t[p].r <= r) {add_edge(u, p, w);return;}if (l <= (t[p].l + t[p].r) / 2) add_out_tree_edge(l, r, p * 2, u, w);if (r > (t[p].l + t[p].r) / 2) add_out_tree_edge(l, r, p * 2 + 1, u, w);
}
int dis[16000100];
bool vis[16000100];
int cnt = 8000100;
priority_queue<pair<int, int>> pq;
void dijkstra() {memset(dis, 0x3f, sizeof(dis));dis[s] = 0;pq.push({0, s});while (pq.size()) {int now = pq.top().second;pq.pop();if (vis[now]) continue;vis[now] = 1;for (int i = head[now]; i; i = ed[i].nxt) {int v = ed[i].v;if (dis[v] > dis[now] + ed[i].w) {dis[v] = dis[now] + ed[i].w;pq.push({-dis[v], v});}}}
}
int u, v, l, r, w;
signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> q >> s;make_in_tree(1, n, 1);make_out_tree(1, n, 1);while (q--) {int a, b, c, d;cin >> a >> b >> c >> d;cnt++;add_in_tree_edge(c, d, 1, cnt, 1);add_out_tree_edge(a, b, 1, cnt, 0);cnt++;add_in_tree_edge(a, b, 1, cnt, 1);add_out_tree_edge(c, d, 1, cnt, 0);}s = pos[s] + 8 * n;dijkstra();for (int i = 1; i <= n; i++) {cout << dis[pos[i]] << '\n';}return 0;
}

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

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

相关文章

图论基础|841.钥匙和房间、463. 岛屿的周长

目录 841.钥匙和房间 思路&#xff1a;本题是一个有向图搜索全路径的问题。 只能用深搜&#xff08;DFS&#xff09;或者广搜&#xff08;BFS&#xff09;来搜。 463. 岛屿的周长 841.钥匙和房间 力扣题目链接 (opens new window) 有 N 个房间&#xff0c;开始时你位于 0…

PTA题解 --- 阶梯电价(C语言)

今天是PTA题库解法讲解的第五天&#xff0c;今天我们要讲解A-B&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 要解决这个问题&#xff0c;我们可以编写一个C语言程序&#xff0c;首先判断输入的月用电量是否有效&#xff08;即大于等于0&#xff09;。如果有效&…

STM32学习——入门到放弃篇_1

1、单片机启动 启动过程&#xff0c;先运行启动文件&#xff0c;启动文件里面有一段汇编代码&#xff0c;先执行汇编代码&#xff0c;接着配置时钟&#xff0c;随即进入主函数。 查看单片机主频 2、自己配置时钟树 stm32的RCC系统时钟配置 以及RCC_PLLConfig(uint32_t RCC_PLL…

代码随想录|Day26|贪心01|455.分发饼干、376.摆动序列、53.最大子数组和

455.分发饼干 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子。 局部最优&#xff1a;尽量确保每块饼干被充分利用 全局最优&#xff1a;手上的饼干可以满足尽可能多的孩子 思路&#xff1a;大饼干 尽量分给 大胃口孩子 将小孩和饼干数组排序&#xff0c;我们从大到…

ABAP笔记:定义指针,动态指针分配:ASSIGN COMPONENT <N> OF STRUCTURE <结构> TO <指针>.

参考大佬文章学习&#xff0c;总结了下没有提到的点&#xff1a;SAP ABAP指针的6种用法。_abap 指针-CSDN博客 定义指针&#xff1a;其实指针这玩意&#xff0c;就是类似你给个地方&#xff0c;把东西临时放进去&#xff0c;然后指针就是这个东西的替身了&#xff0c;写代码的…

洛谷day3

B2053 求一元二次方程 - 洛谷 掌握printf用法&#xff1b; #include <iostream> #include <cmath> using namespace std; double a,b,c; double delta; double x1,x2;int main() {cin>>a>>b>>c;delta b*b-4*a*c;if(delta>0){x1 (-bsqrt…

Linux查看磁盘空间

查看磁盘空间 df -h 查看目录所占空间 du -sh [目录] 查看当前目录下, 所有目录所占空间 (一级目录) find . -maxdepth 1 -type d -exec du -sh {} \;-maxdepth 1 查看的目录深度是1级, 2则是2级

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率&#xff0c;就喜欢拿抛硬币做例子。大多数时候&#xff0c;会简单认为硬币正背面的概率各为二分之一&#xff0c;其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文&#xff0c;引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…

注意力机制篇 | YOLOv8改进之添加CBAM注意力机制

前言:Hello大家好,我是小哥谈。CBAM是一种用于图像分类的注意力机制,全称为Convolutional Block Attention Module。它可以自适应地学习每个通道和空间位置的重要性,从而提高模型的性能。CBAM由两个部分组成:通道注意力模块和空间注意力模块。通道注意力模块通过学习每个通…

生物信息学文章中常见的图应该怎么看?

目录 火山图 热图 箱线图 森林图 LASSO回归可视化图&#xff08;套索图&#xff09; 交叉验证图 PCA图 ROC曲线图 这篇文章只介绍这些图应该怎么解读&#xff0c;具体怎么绘制&#xff0c;需要什么参数&#xff0c;怎么处理数据&#xff0c;会在下一篇文章里面给出 火山…

【】(综合练习)博客系统

在之前的学些中&#xff0c;我们掌握了Spring框架和MyBatis的基本使用&#xff0c;接下来 我们就要结合之前我们所学的知识&#xff0c;做出一个项目出来 1.前期准备 当我们接触到一个项目时&#xff0c;我们需要对其作出准备&#xff0c;那么正规的准备是怎么样的呢 1.了解需求…

基于Java中的SSM框架实现快餐店线上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现快餐店线上点餐系统演示 摘要 随着计算机互联网的高速发展。餐饮业的发展也加入了电子商务团队。各种网上点餐系统纷纷涌现&#xff0c;不仅增加了商户的销售量和营业额&#xff0c;而且为买家提供了极大的方便&#xff0c;足不出户&#xff0c;就能订…