【图论经典题目讲解】洛谷 P2149 Elaxia的路线

2024-02-16 09:36

本文主要是介绍【图论经典题目讲解】洛谷 P2149 Elaxia的路线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P2149 Elaxia的路线

D e s c r i p t i o n \mathrm{Description} Description

给定 n n n 个点, m m m 条边的无向图,求 2 2 2 个点对间最短路的最长公共路径

S o l u t i o n \mathrm{Solution} Solution

最短路有可能不唯一,所以公共路径的长度就有可能不同。

2 2 2 条最短路都会经过的边(包括同向和异向)记录出来,并建立 1 1 1 个新图,那么由于最短路(可以看做一条链)一定不会走环,故新图必定是一个 有向无环图 (简称 D A G \mathrm{DAG} DAG),而 D A G \mathrm{DAG} DAG 图上就可以跑 DP 来求解最长链,由于找出的是 2 2 2 条最短路都经过的边,所以最长链其实就是 2 2 2 条最短路的最长公共路径。

故,该问题得以解决。

C o d e Code Code

#include <bits/stdc++.h>
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int SIZE = 1e6 + 10;int N, M;
int X1, Y1, X2, Y2;
int h[SIZE], hs[SIZE], e[SIZE], ne[SIZE], w[SIZE], idx;
int D[4][SIZE], Vis[SIZE], in[SIZE], q[SIZE], hh, tt = -1;
int F[SIZE];void add(int h[], int a, int b, int c)
{e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}void Dijkstra(int Start, int dist[])
{for (int i = 1; i <= N; i ++)dist[i] = 1e18, Vis[i] = 0;priority_queue<PII, vector<PII>, greater<PII>> Heap;Heap.push({0, Start}), dist[Start] = 0;while (Heap.size()){auto Tmp = Heap.top();Heap.pop();int u = Tmp.second;if (Vis[u]) continue;Vis[u] = 1;for (int i = h[u]; ~i; i = ne[i]){int j = e[i];if (dist[j] > dist[u] + w[i]){dist[j] = dist[u] + w[i];Heap.push({dist[j], j});}}}
}void Topsort()
{hh = 0, tt = -1;for (int i = 1; i <= N; i ++)if (!in[i])q[ ++ tt] = i;while (hh <= tt){int u = q[hh ++];for (int i = hs[u]; ~i; i = ne[i]){int j = e[i];if ((-- in[j]) == 0)q[ ++ tt] = j;}}
}signed main()
{cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);memset(h, -1, sizeof h);memset(hs, -1, sizeof hs);cin >> N >> M >> X1 >> Y1 >> X2 >> Y2;int u, v, c;while (M --){cin >> u >> v >> c;add(h, u, v, c), add(h, v, u, c);}Dijkstra(X1, D[0]), Dijkstra(Y1, D[1]);Dijkstra(X2, D[2]), Dijkstra(Y2, D[3]);for (int i = 1; i <= N; i ++)for (int j = h[i]; ~j; j = ne[j]){int k = e[j];if (D[0][i] + w[j] + D[1][k] == D[0][Y1] && D[2][i] + w[j] + D[3][k] == D[2][Y2])add(hs, i, k, w[j]), in[k] ++;}Topsort();for (int it = 0; it <= tt; it ++){int i = q[it];for (int j = hs[i]; ~j; j = ne[j]){int k = e[j];F[k] = max(F[k], F[i] + w[j]);}}int Result = 0;for (int i = 1; i <= N; i ++)Result = max(Result, F[i]);memset(hs, -1, sizeof hs);memset(F, 0, sizeof F);memset(in, 0, sizeof in);for (int i = 1; i <= N; i ++)for (int j = h[i]; ~j; j = ne[j]){int k = e[j];if (D[0][i] + w[j] + D[1][k] == D[0][Y1] && D[3][i] + w[j] + D[2][k] == D[2][Y2])add(hs, i, k, w[j]), in[k] ++;//, cout << i << " " << k << endl;}Topsort();for (int it = 0; it <= tt; it ++){int i = q[it];for (int j = hs[i]; ~j; j = ne[j]){int k = e[j];F[k] = max(F[k], F[i] + w[j]);}}for (int i = 1; i <= N; i ++)Result = max(Result, F[i]);cout << Result << endl;return 0;
}

这篇关于【图论经典题目讲解】洛谷 P2149 Elaxia的路线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714158

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

MySQL连表查询之笛卡尔积查询的详细过程讲解

《MySQL连表查询之笛卡尔积查询的详细过程讲解》在使用MySQL或任何关系型数据库进行多表查询时,如果连接条件设置不当,就可能发生所谓的笛卡尔积现象,:本文主要介绍MySQL连表查询之笛卡尔积查... 目录一、笛卡尔积的数学本质二、mysql中的实现机制1. 显式语法2. 隐式语法3. 执行原理(以Nes

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

javascript fetch 用法讲解

《javascriptfetch用法讲解》fetch是一个现代化的JavaScriptAPI,用于发送网络请求并获取资源,它是浏览器提供的全局方法,可以替代传统的XMLHttpRequest,这篇... 目录1. 基本语法1.1 语法1.2 示例:简单 GET 请求2. Response 对象3. 配置请求

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl