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]桥的更多相关文章

  1. 洛谷2685 [TJOI2012]桥

    [TJOI2012]桥 题目大意:给定一无向图,求删除一条边后1到n最短路的最大值,以及方案数. 做法:我们先从1为起点.从n为起点跑两边dij,获得每一个点到起点1.终点n的最短距离,其实距离和边权 ...

  2. [TJOI2012]桥(最短路+线段树)

    有n个岛屿, m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前的能力,是不可能通过的 ...

  3. [TJOI2012]桥

    Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...

  4. bzoj4400: tjoi2012 桥

    先传代码再填坑 #include <iostream> #include <cstdio> #include <cmath> #include <cstrin ...

  5. BZOJ4400 TJOI2012桥(最短路+线段树)

    首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  8. hub,桥,交换机,路由器的区别

    1.四种设备在网络中的物理位置 如下图 2.这四种设备的本质 这四种设备,不管怎样,他们都是进行包的转发,只不过转发的行为有些不一样而已 3.逐一介绍 对于hub,一个包过来后,直接将包转发到其他口. ...

  9. 游戏测评-桥梁建造系Poly Bridge破力桥?游戏测评

    最近在b站看到了谜之声的视频:大家来造桥吧! 实在是太搞笑了,看到是一款新出不久还未正式发行的游戏,兴致一来便入手玩了玩.顺手也就写下了这篇测评. POLY BRIDGE 对这个游戏名怎么起个有趣的中 ...

随机推荐

  1. c# 调用浏览器打开网址并全屏

    关键性参数 Google Chrome浏览器 Process process = Process.Start("chrome.exe", " --kiosk " ...

  2. git二、基本使用

    1:创建仓库  git init - 当前目录下初始化仓库,根目录产生.git文件-包含元数据文件,为其他git命令提供环境 2:克隆仓库  git clone url - 拷贝一个 Git 仓库到本 ...

  3. python查询数据库返回数据

    python查询数据库返回数据主要运用到flask框架,pymysql 和 json‘插件’ #!/usr/bin/python # -*- coding: UTF-8 -*- import pymy ...

  4. Java课程02-动手动脑

    1.编写一个方法,生成一千个随机数,纯随机数发生器. package random; public class random { public static void main(String[] ar ...

  5. Install Sudo for Debian

    $ su $ apt-get install sudo $ vim /etc/sudoers 1 2 3 在文本中添加: "username" ALL=(ALL) ALL 1 保存 ...

  6. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...

  7. web攻击之xss(一)

    1,xss简介 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击 ...

  8. SpringBoot 注解

    @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(stereotype)注解.它为阅 ...

  9. redis 通用函数

    redis 通用函数 construct 命令/方法/函数 Description Creates a Redis client 创建一个Redis客户端 Example $redis = new R ...

  10. 媒体查询@media 屏幕适配

    @media(max-width: 1199px){.banner{height: 400px;}}1.6倍@media(min-width: 1200px) and (max-width: 1365 ...