当前位置: 首页 > news >正文

洛谷 P1491 集合位置

题意

给定一张 n n n m m m 边的无向图,第 i i i 个点坐标为 ( x i , y i ) (x_i,y_i) (xi,yi),求 1 → n 1 \to n 1n非严格次短路(不允许重复经过点和边)。

思路

我们采用删边的思想,先跑一遍最短路,记录路径,然后依次删掉最短路上每条边,分别跑一遍最短路,再取个最小值即可。

为什么这是正确的呢?首先,次短路至少有一条边不属于最短路。其次,我们不用枚举不在最短路上的边,因为删这些边对最短路没有影响。

至于如何删边,不需要直接在邻接表中找到后再删,这没必要,还会超时,只需要在跑最短路的时候,传入两个参数,分别是要删掉的边的两个端点,只要当前边相连的是这两个点,就直接忽略掉(注意无向图)。

typedef double real;
typedef pair<int, double> PID;
typedef pair<double, int> PDI;
const real INF = 1e20;struct Graph{int n;vector<vector<PID>> G;vector<real> dis;vector<int> pre;vector<bool> vis;Graph(int _n): n(_n){G.resize(n);}// Add an undirected edge <u, v> to the graph with edge weight `w`。void insert(int u, int v, real w){G[u].push_back({v, w});G[v].push_back({u, w});}// Starting from s, run the shortest path, ignoring edges (du, dv).// If (du, dv) = (-1, -1), then no edge will be deleted and the path will be recorded in `pre`.void dij(int s, int du = -1, int dv = -1){dis.assign(n, INF);vis.assign(n, false);if(du == -1 && dv == -1) pre.assign(n, -1);priority_queue<PDI, vector<PDI>, greater<PDI>> q;dis[s] = 0.;q.push({0., s});while(q.size()){int u = q.top().second;q.pop();if(vis[u]) continue;vis[u] = true;for(auto &edge: G[u]){int v = edge.first;real w = edge.second;if((du == u && dv == v) || (du == v && dv == u)) continue;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;q.push({dis[v], v});if(du == -1 && dv == -1) pre[v] = u;}}}}
};

代码

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
#define int long longtypedef double real;
typedef pair<int, double> PID;
typedef pair<double, int> PDI;
const real INF = 1e20;struct Graph{int n;vector<vector<PID>> G;vector<real> dis;vector<int> pre;vector<bool> vis;Graph(int _n): n(_n){G.resize(n);}void insert(int u, int v, real w){G[u].push_back({v, w});G[v].push_back({u, w});}void dij(int s, int du = -1, int dv = -1){dis.assign(n, INF);vis.assign(n, false);if(du == -1 && dv == -1) pre.assign(n, -1);priority_queue<PDI, vector<PDI>, greater<PDI>> q;dis[s] = 0.;q.push({0., s});while(q.size()){int u = q.top().second;q.pop();if(vis[u]) continue;vis[u] = true;for(auto &edge: G[u]){int v = edge.first;real w = edge.second;if((du == u && dv == v) || (du == v && dv == u)) continue;if(dis[v] > dis[u] + w){dis[v] = dis[u] + w;q.push({dis[v], v});if(du == -1 && dv == -1) pre[v] = u;}}}}
};real dist(real x1, real y1, real x2, real y2){real p = x1 - x2, q = y1 - y2;return sqrt(p * p + q * q);
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;cin >> n >> m;vector<real> x(n), y(n);Graph G(n);for(int i = 0; i < n; i++) cin >> x[i] >> y[i];for(int i = 0, u, v; i < m; i++){cin >> u >> v;u--, v--;real w = dist(x[u], y[u], x[v], y[v]);G.insert(u, v, w);}G.dij(0);real ans = INF;for(int i = n - 1; i; i = G.pre[i]){G.dij(0, i, G.pre[i]);ans = min(ans, G.dis.back());}if(ans >= INF) printf("-1\n");else printf("%.2lf\n", ans);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue3中的Composables组合式函数,Vue3实现minxins
  • Dns被莫名篡改的逆向分析定位(笔记)
  • 大数据之路 读书笔记 Day4 数据同步
  • STM32-PWR和WDG看门狗
  • 配置下载 docker镜像 playedu开源 最佳实践部署
  • 使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输
  • Java开发的13个关键技术:掌握核心,驾驭未来
  • linux修改内核实现禁止被ping(随手记)
  • Pycharm python解释器 unsupported python 3.1 解决
  • [护网训练]原创应急响应靶机整理集合
  • 【Java EE】Spring Boot配置文件
  • 智能交通(3)——Learning Phase Competition for Traffic Signal Control
  • git commit 怎么跳过 husky, commitlint 的检查
  • Spring Boot中的API文档生成
  • 【游戏引擎之路】登神长阶(六)——雅达利2600汇编学习,任天堂居然还真不是抄袭起家
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Median of Two Sorted Arrays
  • Node + FFmpeg 实现Canvas动画导出视频
  • node 版本过低
  • ReactNativeweexDeviceOne对比
  • Redis中的lru算法实现
  • Sequelize 中文文档 v4 - Getting started - 入门
  • vue 配置sass、scss全局变量
  • vue.js框架原理浅析
  • webpack项目中使用grunt监听文件变动自动打包编译
  • Web设计流程优化:网页效果图设计新思路
  • 包装类对象
  • 和 || 运算
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 思否第一天
  • 微信支付JSAPI,实测!终极方案
  • 我有几个粽子,和一个故事
  • 用jquery写贪吃蛇
  • 《码出高效》学习笔记与书中错误记录
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • $nextTick的使用场景介绍
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)(1.9) MSP (version 4.2)
  • (C++20) consteval立即函数
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (转) ns2/nam与nam实现相关的文件
  • (转)Mysql的优化设置
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)Google Chrome调试JS
  • .NET BackgroundWorker