P2685 [TJOI2012]桥

P2685 [TJOI2012]桥 

思路:

先求出最短路: d1[u] : u 到 1 的最短路, d2[u] : u 到 n 的最短路

再求出一条从 1 到 n 的最短路链,然后从链上的每一个点出发dfs, 求出:

l[u] : u 到 1 的最短路径过中和链的交点(离 1 最近的)

r[u] : u 到 n 的最短路径过中和链的交点(离 n 最近的)

然后对于一条非链上的边( u  ->  v ),边权为 w ,对于链上的 l[u] 到 r[v] 之间的边任意删一条边,

最短路都有可能变成 d1[u] + w + d2[v] 然后在链上维护这个的最小值,就能知道删掉链上的每条边对最短路的影响

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//headconst int N = 1e5 + 5;
const int INF = 0x3f3f3f3f;
int n, m, u, v, w, tot, d1[N], d2[N], link[N], id[N], l[N], r[N], a[N];
int head[N], cnt = 0;
bool vis[N*2];
struct edge {int to, w, nxt;
}edge[N*4];
void add(int u, int v, int w) {edge[++cnt] = {v, w, head[u]};head[u] = cnt;
}
priority_queue<pii, vector<pii>, greater<pii> > q;
int tree[N<<2], lazy[N<<2];
void push_up(int rt) {tree[rt] = min(tree[rt<<1], tree[rt<<1|1]);
}
void push_down(int rt) {tree[rt<<1] = min(tree[rt<<1], lazy[rt]);tree[rt<<1|1] = min(tree[rt<<1|1], lazy[rt]);lazy[rt<<1] = min(lazy[rt<<1], lazy[rt]);lazy[rt<<1|1] = min(lazy[rt<<1|1], lazy[rt]);lazy[rt] = INF;
}
void build(int rt, int l, int r) {lazy[rt] = INF;if(l == r) {tree[rt] = INF;return ;}int m = l+r >> 1;build(ls);build(rs);push_up(rt);
}
void down(int rt, int l, int r) {if(l == r) {a[l] = tree[rt];return ;}if(lazy[rt] != INF) push_down(rt);int m = l+r >> 1;down(ls);down(rs);push_up(rt);
}
void update(int L, int R, int x, int rt, int l, int r) {if(L <= l && r <= R) {tree[rt] = min(tree[rt], x);lazy[rt] = min(lazy[rt], x);return ;}if(lazy[rt] != INF) push_down(rt);int m = l+r >> 1;if(L <= m) update(L, R, x, ls);if(R > m) update(L, R, x, rs);push_up(rt);
}void Dijkstra(int s, int *d) {for (int i = 1; i <= n; ++i) d[i] = INF;d[s] = 0;q.push({0, s});while(!q.empty()) {pii p = q.top();q.pop();int u = p.se;if(d[u] < p.fi) continue;for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;if(d[v] > p.fi + w) {d[v] = p.fi + w;q.push({d[v], v});}}}
}
void dfs(int u, int s, int *bl, int *d) {bl[u] = s;for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;//if(vis[(i+1)/2]) continue;if(bl[v] == 0 && id[v] == 0 && d[u] + w == d[v]) dfs(v, s, bl, d);}
}
int main() {scanf("%d %d", &n, &m);for (int i = 1; i <= m; ++i) {scanf("%d %d %d", &u, &v, &w);add(u, v, w);add(v, u, w);}Dijkstra(1, d1);Dijkstra(n, d2);tot = 0;u = 1;while(u != n) {link[++tot] = u;id[u] = tot;for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;if(d2[v] + w == d2[u]){vis[(i+1)/2] = true;u = v;break;}}}link[++tot] = n;id[n] = tot;for (int i = 1; i <= tot; ++i) dfs(link[i], link[i], l, d1);for (int i = tot; i >= 1; --i) dfs(link[i], link[i], r, d2);build(1, 1, tot-1);for (int u = 1; u <= n; ++u) {for (int i = head[u]; i; i = edge[i].nxt) {int v = edge[i].to;int w = edge[i].w;if(!vis[(i+1)/2]) {if(id[l[u]] < id[r[v]]) update(id[l[u]], id[r[v]]-1, d1[u] + w + d2[v], 1, 1, tot-1);}}}down(1, 1, tot-1);int ans = 0, cnt = 0;for (int i = 1; i < tot; ++i) {if(a[i] > ans) {ans = a[i];cnt = 1;}else if(a[i] == ans) {cnt++;}}if(ans == d1[n]) cnt = m;printf("%d %d\n", ans, cnt);return 0;
}

 

转载于:https://www.cnblogs.com/widsom/p/10599870.html

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

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

相关文章

C#结构类型图

转载于:https://www.cnblogs.com/kangao/p/8674838.html

C# 全局钩子实现扫码枪获取信息

1.扫描枪获取数据原理基本相当于键盘数据&#xff0c;获取扫描枪扫描出来的数据&#xff0c;一般分为两种实现方式。 a&#xff09;文本框输入获取焦点&#xff0c;扫描后自动显示在文本框内。 b&#xff09;使用键盘钩子&#xff0c;勾取扫描枪虚拟按键&#xff0c;根据按键频…

Centos下安装mysql(二进制版)

Centos下安装mysql&#xff08;二进制版&#xff09; 1.下载安装包&#xff0c;选择相应的平台、版本&#xff0c;比如&#xff0c;选择64位Linux平台下的MySQL二进制包“Linux-Generic &#xff08;glibc 2.5&#xff09;&#xff08;x86&#xff0c;64-bit&#xff09;&#…

使用gradle多渠道打包

以友盟的多渠道打包为例&#xff0c;如果我们须要打包出例如以下渠道&#xff1a;UMENG, WANDOUJIA, YINGYONGBAO。 第一种方法。是须要创建文件的。我们在写完我们的代码之后&#xff0c;在app/src以下。分别创建和main同级目录的目录umeng, wandoujia, yingyongbao,这三个目录…

SMMS 2016 啟用深色主題

1、用文本類編輯器 打開C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio目錄下的 ssms.pkgundef 2、去除// Remove Dark theme行以下的注釋 3、重新打開SMMS&#xff0c;如果還沒有出現“深色”主題&#xff0c;請執行第4點 4、打開powershell【…

四大步骤,彻底关闭Win10自动更新

尽管Win11已经发布了一段时间&#xff0c;但目前互联网上大部分电脑用户所使用的的操作系统仍是Win10&#xff0c;对于Win10&#xff0c;笔者相信大部分人应该都不陌生&#xff0c;作为目前市面上占比最高的电脑系统&#xff0c;Win10的许多功能和操作逻辑都十分优秀&#xff0…

LeetCode算法题-Repeated String Match(Java实现)

这是悦乐书的第289次更新&#xff0c;第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题&#xff08;顺位题号是686&#xff09;。给定两个字符串A和B&#xff0c;找到A必须重复的最小次数&#xff0c;使得B是它的子字符串。 如果没有这样的解决方案&a…

php

●转载于:https://www.cnblogs.com/volcanorao/p/8678104.html

Vs快捷键设置(可搭配Vim使用)

设置方式: 通过在Vs菜单栏的工具->选项->环境->键盘。 常用快捷键: 推荐键位编辑.转到定义Alt G切换标题代码文件Alt Q查看.向前导航Alt D查看.向后导航Alt A调试.调用堆栈Alt 7调试.监视1Alt 8调试.内存1Alt 9查看.查找符号结果Alt 1查看.错误列表Alt …

虚拟机windows7安装启动MYSQL5.7

一.环境 环境&#xff1a;虚拟机VMVare 系统&#xff1a;windows7旗舰版 MYSQL版本&#xff1a;mysql5.7.25 二.具体步骤 1.首先下载安装mysql5.7.25&#xff0c;这里用的是安装版的mysql&#xff0c;网上大多数都是推荐去官网下载&#xff0c;这里推荐的是清华大学开源镜像站…

故障转移架构的本质:数据中心的基础设施过剩

数据中心构成了全球互联基础设施的核心&#xff0c;我们称之为“云”。从根本上讲&#xff0c;云计算指的是基础设施从桌面计算&#xff08;文件和应用程序存储在计算机的本地硬盘上&#xff09;到在线计算&#xff08;文件和应用程序存储在可通过互联网远程访问的数据中心中&a…

CentOS启动Tomcat巨慢

在本地开发环境&#xff0c;应用正常启动。 在CentOS测试环境&#xff0c;应用启动速度也是正常的。 但是在阿里云的生产环境&#xff0c;tomcat启动超级慢&#xff0c;并且在最终打印出来以下内容&#xff1a; org.apache.catalina.util.SessionIdGenerator createSecureRando…

Oracle 存储过程

什么是存储过程&#xff1f;存储过程是一种命名的PL/SQL程序块&#xff0c;它是由一些T-SQL语句组成的代码块&#xff0c;这些T-SQL语句代码像一个方法一样实现一些功能&#xff08;对单表或多表的增删改查&#xff09;&#xff0c;可以有参数、输入输出参数&#xff0c;通常没…

查看Oracle 版本信息

select * from v$version;转载于:https://www.cnblogs.com/hanje/p/10614555.html

ubuntu上安装docker

在Ubuntu16.04上安装Docker Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付产品。Docker可将应用程序和基础设施层隔离&#xff0c;并且将基础设施当作程序一样进行管理。使用Docker&#xff0c;可以更快地打包&#xff0c;测试以及部署应用程序&#xff0c;并可以…

字符串问题之 在有序但含有空的数组中查找字符串

尽可能使用二分查找 假设在 left right 之间查找 关键是mid处理过程 导致 left 跟 right 的改变 控制去哪里寻找 分如下情况&#xff1a; 若 mid处 不为空&#xff0c;并且 此处就是 str 那么记下 mid &#xff0c;同时把right-1 &#xff08;往左寻找&#xff09; 若…

Python_48re模块的sub方法

sub是替换的功能 sub(模型&#xff0c;替换为的字符&#xff0c;目标原字符串&#xff0c;替换次数) import re yuanchuan1qaz2wsx3edc4rfv5tgb new_strre.sub(\d,INTNUM,yuanchuan,2) #若果没有2表示默认替换所有的 print (new_str) #输出结果为&#xff1a;INTNUMqazINTNUMw…

个人笔记-vuex

个人笔记-vuex 最近想要沉淀下自己的知识体系&#xff0c;以前光看不记&#xff0c;当时记得&#xff0c;过段时间记忆就模糊了&#xff0c;好脑子不如烂笔头&#xff0c;古人诚不欺我&#xff0c;所以现在决定给用自己的语言方式来给自己记个笔记。 vuex vuex 有什么好讲的呢&…

常用模块之hashlib,configparser,logging模块

常用模块二 hashlib模块 hashlib提供了常见的摘要算法&#xff0c;如md5和sha1等等。 那么什么是摘要算法呢?摘要算法又称为哈希算法、散列算法。它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的数据串&#xff08;通常用16进制的字符串表示&#xff09;。 注…

iPhone屏幕各种尺寸分辨率(更新至XS)

iPhone屏幕各种尺寸分辨率&#xff08;更新至XS&#xff09; DeviceLogic PointLogic PixelSizeScaleiPhone 2G480 320480 3203.51xiPhone 3480 320480 3203.51xiPhone 3GS480 320480 3203.51xiPhone 4480 320960 6403.52xiPhone 4S480 320960 6403.52xiPhone 5568 …