[TJOI2012]桥

题目大意:给定一无向图,求删除一条边后1到n最短路的最大值,以及方案数。

做法:我们先从1为起点、从n为起点跑两边dij,获得每一个点到起点1、终点n的最短距离,其实距离和边权之间的关系相当于构建了由1为根的和由n为根的最短路树---所有最短路组成的树。

不难发现,要删除一条边,并使得最短路增大,一定要删除最短路上的边。所以我们找到从1到n的一条最短路链。找的方法就是在由n为根的最短路树上从1开始向N走。

接下来我们从这个最短路链上每一个点,在以1为根和以n为根的最短路树上进行bfs(仅向儿子bfs)。目的是找到对于每一个不在最短路链上的点x,找到1到x最短路与1到n最短路最后一个重合的点l[x],你也可以理解为在以1为根的最短路树上x与n的lca。同理还有以n为根的最短路上x和1的lca。

接下来我们枚举每一条不在最短路链上的边u->v,不难想到,从1到N经过边u->v的最短路一定是1->l[u]->u->v->r[v]->n的这种形式。那么在1->n的最短路上,l[u]->r[v]这一段区间内任意一条边的删除,从1到n的最短路有可能变为1->l[u]->u->v->r[v]->n。由于是最短路,所以就要更新所有这种形式的最小值。并且所有不在1->N最短路链上的边都能影响一个区间,所以这就变成了一个区间最小值问题,可以用线段树维护。用线段树维护1->N最短路上的边,线段树每一个元素代表删除这条边后最短路的长度。

最后我们扫一遍整个线段树,找最大值即可。注意如果所有的值相等(且等于最短路径),说明无论删除哪一条边都不会使得最短路径长度增加,所以删除图里任意一条边均可,tot=m。

代码如下(没有坑,可以直接复制提交)

声明:如果您在非ghj1222的博客看到本篇文章且未标明转载,请联系ghj1222

强烈谴责某网站的无耻行为

如果下面一段代码没有高亮显示,那么您在浏览该网站。

#include <bits/stdc++.h>
using namespace std; int n, m, tot, res[100010]; struct SegmentTree
{
int tree[400010]; void init(int x, int l, int r)
{
tree[x] = 0x3f3f3f3f;
if (l == r)
return;
int mid = (l + r) >> 1;
init((x << 1), l, mid);
init((x << 1) | 1, mid + 1, r);
} void update(int x, int L, int R, int cl, int cr, int key)
{
if (cr < L || cl > R)
return;
if (cl >= L && cr <= R)
{
tree[x] = min(tree[x], key);
return;
}
int mid = (cl + cr) >> 1;
update(x << 1, L, R, cl , mid, key);
update((x << 1) | 1, L, R, mid + 1, cr, key);
} void pushdown(int x, int l, int r)
{
if (l == r)
{
res[l] = tree[x];
return;
}
tree[x << 1] = min(tree[x << 1], tree[x]);
tree[(x << 1) | 1] = min(tree[(x << 1) | 1], tree[x]);
int mid = (l + r) >> 1;
pushdown(x << 1, l, mid);
pushdown((x << 1) | 1, mid + 1, r);
}
}segtree; struct edge
{
int v, w, ne;
}a[400010];
bool in[400010]; int h[100010], dis1[100010], dis2[100010], link[100010], id[100010], l[100010], r[100010];
bool v[100010]; void add(int x, int y, int z)
{
static int tmp = 0;
a[++tmp] = (edge){y, z, h[x]};
h[x] = tmp;
} void dij(int *dis, int src)
{
for (int i = 1; i <= n; i++)
{
dis[i] = 0x3f3f3f3f;
v[i] = false;
}
dis[src] = 0;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > >q;
q.push(make_pair(0, src));
while (!q.empty())
{
int x = q.top().second;
q.pop();
if (v[x])
continue;
v[x] = true;
for (int i = h[x]; i != 0; i = a[i].ne)
{
if (v[a[i].v] == false && dis[x] + a[i].w < dis[a[i].v])
{
dis[a[i].v] = dis[x] + a[i].w;
q.push(make_pair(dis[a[i].v], a[i].v));
}
}
}
} void getLink()
{
int x = 1;
while (x != n)
{
link[++tot] = x;
id[x] = tot;
for (int i = h[x]; i != 0; i = a[i].ne)
{
if (dis2[x] == dis2[a[i].v] + a[i].w)
{
in[i] = true;
x = a[i].v;
break;
}
}
}
link[++tot] = n;
id[n] = tot;
} void bfs(int src, int *dis, int *arr)
{
queue<int> q;
q.push(link[src]);
arr[link[src]] = src;
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i = h[x]; i != 0; i = a[i].ne)
if (id[a[i].v] == 0 && arr[a[i].v] == 0 && dis[x] + a[i].w == dis[a[i].v])
{
arr[a[i].v] = src;
q.push(a[i].v);
}
}
} int main()
{
scanf("%d%d", &n, &m);
for (int x, y, z, i = 1; i <= m; i++)
{
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
dij(dis1, 1);
dij(dis2, n);
getLink();
for (int i = 1; i <= tot; i++)
bfs(i, dis1, l);
for (int i = tot; i >= 1; i--)
bfs(i, dis2, r);
segtree.init(1, 1, tot);
for (int x = 1; x <= n; x++)
for (int i = h[x]; i != 0; i = a[i].ne)
if (in[i] == false && l[x] > 0 && r[a[i].v] > 0 && l[x] < r[a[i].v])
segtree.update(1, l[x], r[a[i].v] - 1, 1, tot, dis1[x] + a[i].w + dis2[a[i].v]);
segtree.pushdown(1, 1, tot);
int cnt = 0, ans = 0;
for (int i = 1; i < tot; i++)
{
if (res[i] > ans)
{
ans = res[i];
cnt = 1;
}
else if (res[i] == ans)
cnt++;
}
if (ans == dis1[n])
cnt = m;
printf("%d %d\n", ans, cnt);
return 0;
}

洛谷2685 [TJOI2012]桥的更多相关文章

  1. 洛谷 P1656 炸铁路

    P1656 炸铁路 题目提供者kkksc03 标签图论搜索/枚举洛谷原创 难度普及/提高- 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵 ...

  2. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

    题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...

  3. 【洛谷】P1052 过河【DP+路径压缩】

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...

  4. 洛谷P1007 独木桥 [数论]

    题目传送门 独木桥 题目背景 战争已经进入到紧要时间.你是运输小队长,正在率领运输部队向前线运送物资.运输任务像做题一样的无聊.你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在 ...

  5. 【洛谷3224/BZOJ2733】[HNOI2012]永无乡 (Splay启发式合并)

    题目: 洛谷3224 分析: 这题一看\(n\leq100000\)的范围就知道可以暴力地用\(O(nlogn)\)数据结构乱搞啊-- 每个联通块建一棵Splay树,查询就是Splay查询第k大的模板 ...

  6. 洛谷 1052 dp 状态压缩

    洛谷1052 dp 状态压缩 传送门 (https://www.luogu.org/problem/show?pid=1052#sub) 做完这道题之后,感觉涨了好多见识,以前做的好多状压题目都是将一 ...

  7. 洛谷P1052 过河

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...

  8. 【经典DP】洛谷 P2782 友好城市

    嘤嘤嘤,昨天两个文化课老师在上奥赛时招呼我(亲切交流),今天又要写工作报告,没时间写题解,希望今天能补上 友好城市 题目://洛谷那粘来的题面竟然能把格式粘过来 题目描述 有一条横贯东西的大河,河有笔 ...

  9. 洛谷p1052过河 路径压缩+dp

    洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...

随机推荐

  1. C#字符串全排序

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 ...

  2. oracle 密码默认180天过期

    alter profile default limit password_life_time unlimited; alter user username identified by 'pwd';

  3. javascript——对象的概念——函数 3 (使用技巧)

    1.回调函数:将函数A传给函数B,由函数B来执行A,则称A为回调函数. 例1: 例2 function addone(a){;}; //定义一个回调函数 function mulitiply(a,b, ...

  4. SqlServer——存储过程(未完工)

    http://www.cnblogs.com/blsong/archive/2009/11/30/1613534.html http://blog.csdn.net/lenotang/article/ ...

  5. Tiny4412 u-boot分析(2)u-boot启动流程

    从大方面来说,u-boot的启动分成两个阶段,第一个阶段主要的职责是准备初始化的环境,主要有以下几点 ①设置异常向量表 ②把CPU的工作模式设置为SVC32模式 ③关闭中断.MMU和cache ④关闭 ...

  6. memcache windows64 位安装

    --环境: windows 2008 R2 64位 wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-x64 --目标: 实现 php 用memcach ...

  7. Codeforces 464E The Classic Problem (最短路 + 主席树 + hash)

    题意及思路 这个题加深了我对主席树的理解,是个好题.每次更新某个点的距离时,是以之前对这个点的插入操作形成的线段树为基础,在O(logn)的时间中造出了一颗新的线段树,相比直接创建n颗线段树更省时间. ...

  8. bzoj2751 容易题

    传送门 题目 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我 ...

  9. CF 464E The Classic Problem

    补一补之前听课时候的题. 考虑使用dij算法求最短路,因为边权存不下,所以考虑用主席树维护二进制位,因为每一次都只会在一个位置进行修改,所以可以暴力进位,这样均摊复杂度是对的. <算法导论> ...

  10. XML DTD语法详解

    XML DTD详解   XML DTD详解 前情提要与本文内容介绍 前面的两篇XML相关博文: 第一篇是介绍格式正规的XML: 格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节 第二 ...