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. window系统下搭建本地的NuGet Server

    1. NuGet.Config文件所在的目录: C:\Users\xxx\AppData\Roaming\NuGet 2.将nupkg为结尾的文件放在 项目的Packages目录下.(注意是和web. ...

  2. 再次聊一聊promise settimeout asycn awiat执行顺序---js执行机制 EVENT LOOP

    首先js是单线程 分为同步和异步,异步又分为(macrotask 宏任务 和 microtask微任务 ), 这图还是很清晰嘛,再来一张 总结一下,就是遇到同步先执行同步,异步的丢到一边依次排队,先排 ...

  3. 00JAVA语法基础_动手动脑

    1.仔细阅读示例: EnumTest.java,运行它,分析运行结果? 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本类.枚举目的就是要让某个变量的取值只能为若干固定值中的 ...

  4. js左右大小变化

    点左边左边变大.点右边右边大左边小 <style type="text/css"> *{ margin:0px auto; padding:0px; } #wai{ w ...

  5. asp.net 经常用到需要判断文本框是否输入的数字是小数,有无正负,几位小数,可以封装一起判断

    /// <summary> /// 判断是否为小数点数字且带符号 /// </summary> /// <param name="symbol"> ...

  6. 腾讯笔试编程题,贪吃的小Q(二分查找)

    问题描述 小Q的父母要出差N天,走之前给小Q留下了M块巧克力.小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力. 输入描 ...

  7. oracle修改审计功能

    oracle修改审计功能 如果没有关闭审计功能,审计日志文件默认保存在位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/ 关闭审计:alter system set au ...

  8. Hadoop Mapreduce 调优

  9. CCF CSP 201812-1 小明上学

    题目链接:http://118.190.20.162/view.page?gpid=T80 问题描述 试题编号: 201812-1 试题名称: 小明上学 时间限制: 1.0s 内存限制: 512.0M ...

  10. 数据库表中不建索引,在插入数据时,通过sql语句防止重复添加

    sql 语句 INSERT IGNORE INTO table(aaa,bbb) SELECT '1111','2222' FROM DUAL WHERE NOT EXISTS( ' ) mybati ...