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);
//head const int N = 1e5 + ;
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 = ;
bool vis[N*];
struct edge {
int to, w, nxt;
}edge[N*];
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<<], lazy[N<<];
void push_up(int rt) {
tree[rt] = min(tree[rt<<], tree[rt<<|]);
}
void push_down(int rt) {
tree[rt<<] = min(tree[rt<<], lazy[rt]);
tree[rt<<|] = min(tree[rt<<|], lazy[rt]);
lazy[rt<<] = min(lazy[rt<<], lazy[rt]);
lazy[rt<<|] = min(lazy[rt<<|], 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 >> ;
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 >> ;
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 >> ;
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 = ; i <= n; ++i) d[i] = INF;
d[s] = ;
q.push({, 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] == && id[v] == && d[u] + w == d[v]) dfs(v, s, bl, d);
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = ; i <= m; ++i) {
scanf("%d %d %d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
Dijkstra(, d1);
Dijkstra(n, d2);
tot = ;
u = ;
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+)/] = true;
u = v;
break;
}
}
}
link[++tot] = n;
id[n] = tot;
for (int i = ; i <= tot; ++i) dfs(link[i], link[i], l, d1);
for (int i = tot; i >= ; --i) dfs(link[i], link[i], r, d2);
build(, , tot-);
for (int u = ; 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+)/]) {
if(id[l[u]] < id[r[v]]) update(id[l[u]], id[r[v]]-, d1[u] + w + d2[v], , , tot-);
}
}
}
down(, , tot-);
int ans = , cnt = ;
for (int i = ; i < tot; ++i) {
if(a[i] > ans) {
ans = a[i];
cnt = ;
}
else if(a[i] == ans) {
cnt++;
}
}
if(ans == d1[n]) cnt = m;
printf("%d %d\n", ans, cnt);
return ;
}
P2685 [TJOI2012]桥的更多相关文章
- 洛谷2685 [TJOI2012]桥
[TJOI2012]桥 题目大意:给定一无向图,求删除一条边后1到n最短路的最大值,以及方案数. 做法:我们先从1为起点.从n为起点跑两边dij,获得每一个点到起点1.终点n的最短距离,其实距离和边权 ...
- [TJOI2012]桥(最短路+线段树)
有n个岛屿, m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前的能力,是不可能通过的 ...
- [TJOI2012]桥
Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...
- bzoj4400: tjoi2012 桥
先传代码再填坑 #include <iostream> #include <cstdio> #include <cmath> #include <cstrin ...
- BZOJ4400 TJOI2012桥(最短路+线段树)
首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- hub,桥,交换机,路由器的区别
1.四种设备在网络中的物理位置 如下图 2.这四种设备的本质 这四种设备,不管怎样,他们都是进行包的转发,只不过转发的行为有些不一样而已 3.逐一介绍 对于hub,一个包过来后,直接将包转发到其他口. ...
- 游戏测评-桥梁建造系Poly Bridge破力桥?游戏测评
最近在b站看到了谜之声的视频:大家来造桥吧! 实在是太搞笑了,看到是一款新出不久还未正式发行的游戏,兴致一来便入手玩了玩.顺手也就写下了这篇测评. POLY BRIDGE 对这个游戏名怎么起个有趣的中 ...
随机推荐
- Failed to set MokListRT: Invalid Parameter Something as gone seriously wrong: import_mok_state() failed: Invalid Parameter
今天yum update升级centos7,重启后发现开不了机,报错如下: Failed to set MokListRT: Invalid ParameterSomething as gone se ...
- zookeeper的使用demo(c#/java)
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它 ...
- linux ping: unknown host www.baidu.com
在虚拟机中使用CentOS6.5时,ping www.baidu.com出现报错信息:“ping: unknown hostwww.baidu.com”,虚拟机和物理机网络连接是NAT方式,物理机访问 ...
- Qt QLabel 显示gif动图
#include <QMovie> QMovie * move = new QMovie(":/gif/牵着我的手去浪迹天涯.gif"); ui->label_g ...
- Linux启动顺序、运行级别及开机启动
一.启动顺序 当我们经过BIOS引导,并选择了Linux作为准备引导的操作系统后,接下来的执行顺序如下:1.加载并执行内核 第一个被加载的东西就是内核.然后把内核在内存中解压缩,就可以开始运行了.2. ...
- Django框架详细介绍---中间件(认证)
一.绪论 在cookie和session的应用中,通过在视图函数内添加装饰器判断用户是否登录,把没有登录的用户请求跳转到登录页面,通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可 ...
- 从Redis到Codis移植实践
一. 背景 随着业务的发展,线上Redis的数据越来越多,所以必须考虑扩容的事情了.对于redis的扩容,目前可选的方案有三种:1.client自己做sharding,一般是按key的hash值 ...
- HBase指定大量列集合的场景下并发拉取数据时卡住的问题排查
最近遇到一例,HBase 指定大量列集合的场景下,并发拉取数据,应用卡住不响应的情形.记录一下. 问题背景 退款导出中,为了获取商品规格编码,需要从 HBase 表 T 里拉取对应的数据. T 对商品 ...
- 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)
P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...
- oracle 事务 与 提交
Oracle事务 一般事务(DML)即数据修改(增.删.改)的事务事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作.当事务被提交或回滚后,这些数据才会被 ...