2125: 最短路

Time Limit: 1 Sec  Memory Limit: 259 MB
Submit: 756  Solved: 331
[Submit][Status][Discuss]

Description

给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径。

Input

输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一条无向边v-u,长度为w 最后Q行,每行两个整数v,u表示一组询问

Output

输出Q行,每行一个整数表示询问的答案

Sample Input

9 10 2
1 2 1
1 4 1
3 4 1
2 3 1
3 7 1
7 8 2
7 9 2
1 5 3
1 6 4
5 6 1
1 9
5 7

Sample Output

5
6

HINT

对于100%的数据,N<=10000,Q<=10000

Source

 

[Submit][Status][Discuss]

 #include <cstdio>
#include <cstring> inline int nextChar(void)
{
static const int siz = << ; static char buf[siz];
static char *hd = buf + siz;
static char *tl = buf + siz; if (hd == tl)
fread(hd = buf, , siz, stdin); return int(*hd++);
} inline int nextInt(void)
{
int r = , c = nextChar(); for (; c < ; c = nextChar());
for (; c > ; c = nextChar())
r = r * + c - ''; return r;
} template <class T>
inline T min(const T &a, const T &b)
{
return a < b ? a : b;
} template <class T>
inline T abs(const T &x)
{
return x < ? -x : x;
} const int mxn = ;
const int inf = 0x3f3f3f3f; int n, m, q; int tot;
int hd[mxn];
int to[mxn];
int vl[mxn];
int nt[mxn]; inline void add(int x, int y, int w)
{
nt[tot] = hd[x];
to[tot] = y;
vl[tot] = w;
hd[x] = tot++;
} int dis[mxn];
int que[mxn];
int vis[mxn]; inline void spfa(void)
{
memset(vis, , sizeof vis);
memset(dis, inf, sizeof dis); int lt = , rt = ; que[rt++] = ;
vis[] = ;
dis[] = ; while (lt != rt)
{
int u = que[lt++], v; if (lt > mxn)lt = ; vis[u] = ; for (int i = hd[u]; ~i; i = nt[i])
if (v = to[i], dis[v] > dis[u] + vl[i])
{
dis[v] = dis[u] + vl[i]; if (!vis[v])
{
vis[que[rt++] = v] = ; if (rt > mxn)rt = ;
}
}
}
} struct data
{
int u, v, w; inline data(void) {};
inline data(int a, int b, int c)
: u(a), v(b), w(c) {};
}stk[mxn]; int top; int tim;
int dfn[mxn];
int low[mxn]; int cnt;
int cir[mxn];
int len[mxn];
int bel[mxn];
int fat[mxn][]; inline void addcir(int u, int v)
{
++cnt; while (u != stk[top].u && v != stk[top].v)
{
int x = stk[top].u, y = stk[top].v, w = stk[top].w; if (x != u)bel[x] = cnt, fat[x][] = u;
if (y != u)bel[y] = cnt, fat[y][] = u; len[cnt] += w, cir[x] = cir[y] + w; --top;
} {
int x = stk[top].u, y = stk[top].v, w = stk[top].w; len[cnt] += w, cir[x] = cir[y] + w; fat[y][] = x; --top;
}
} void tarjan(int u, int f)
{
dfn[u] = low[u] = ++tim; for (int i = hd[u], v; ~i; i = nt[i])
if ((v = to[i]) != f)
{
if (!dfn[v])
{
stk[++top] = data(u, v, vl[i]), tarjan(v, u); if (low[v] < low[u])low[u] = low[v]; if (low[v] >= dfn[u])addcir(u, v);
}
else if (dfn[v] < low[u])
low[u] = dfn[v], stk[++top] = data(u, v, vl[i]);
}
} int dep[mxn]; void build(int u)
{
for (int i = hd[u]; ~i; i = nt[i])
dep[to[i]] = dep[u] + , build(to[i]);
} inline void prework(void)
{
spfa(); tarjan(, ); for (int i = ; i <= ; ++i)
for (int j = ; j <= n; ++j)
fat[j][i] = fat[fat[j][i - ]][i - ]; memset(hd, -, sizeof hd), tot = ; for (int i = ; i <= n; ++i)
add(fat[i][], i, ); dep[] = , build();
} inline int getLCA(int a, int b, int &x, int &y)
{
if (dep[a] < dep[b])
a ^= b ^= a ^= b; int ret = dis[a] + dis[b]; for (int i = ; ~i; --i)
if (dep[fat[a][i]] >= dep[b])
a = fat[a][i]; if (a == b)
return x = y = a, ret - dis[a] * ; for (int i = ; ~i; --i)
if (fat[a][i] != fat[b][i])
a = fat[a][i],
b = fat[b][i]; return x = a, y = b, ret - dis[fat[a][]] * ;
} signed main(void)
{
n = nextInt();
m = nextInt();
q = nextInt(); memset(hd, -, sizeof(hd)), tot = ; for (int i = ; i <= m; ++i)
{
int x = nextInt();
int y = nextInt();
int w = nextInt(); add(x, y, w);
add(y, x, w);
} prework(); for (int i = , x, y; i <= q; ++i)
{
int a = nextInt();
int b = nextInt(); int ans = getLCA(a, b, x, y); if (bel[x] && bel[x] == bel[y])
{
ans = dis[a] + dis[b] - dis[x] - dis[y]; int len1 = abs(cir[x] - cir[y]);
int len2 = len[bel[x]] - len1; ans += min(len1, len2);
} printf("%d\n", ans);
}
}

@Author: YouSiki

BZOJ 2125: 最短路的更多相关文章

  1. bzoj 2125 最短路——仙人掌两点间最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的……必须再做一遍. 两点间的情况: 1.直 ...

  2. 【刷题】BZOJ 2125 最短路

    Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...

  3. BZOJ.2125.最短路(仙人掌 最短路Dijkstra)

    题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于 ...

  4. bzoj 2125 最短路 点双 圆方树

    LINK:最短路 一张仙人掌图 求图中两点最短路. \(n<=10000,Q<=10000,w>=1\) 考虑边数是多少 m>=n-1 对于一张仙人掌图 考虑先构建出来dfs树 ...

  5. BZOJ.2125.最短路(仙人掌 圆方树)

    题目链接 圆方树.做题思路不写了.. 就是当LCA是方点时跳进那个环可以分类讨论一下用树剖而不必须用倍增: 如果v是u的(唯一的那个)重儿子,那么u的DFS序上+1的点即是要找的:否则v会引出一条新的 ...

  6. bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列

    %%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 ...

  7. 【BZOJ】2125: 最短路 圆方树(静态仙人掌)

    [题意]给定带边权仙人掌图,Q次询问两点间最短距离.n,m,Q<=10000 [算法]圆方树处理仙人掌问题 [题解]树上的两点间最短路问题,常用倍增求LCA解决,考虑扩展到仙人掌图. 先对仙人掌 ...

  8. Bzoj 3694: 最短路 树链剖分

    3694: 最短路 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 67  Solved: 34[Submit][Status][Discuss] Des ...

  9. bzoj3047: Freda的传呼机 && 2125: 最短路

    Description 为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M条双向光缆.每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传 ...

随机推荐

  1. Swift - 给图片和按钮添加阴影边框

    最近比较忙,想要做的事情有很多,能做出来的就只有一部份,我觉得也许是我没有计划和规律造成的,我需要坚持下去,今天写了一个swift2.0给按钮或者图片添加阴影的效果,就当做笔记吧:-) Swift C ...

  2. 20155226《网络攻防》 Exp5 MSF基础应用

    20155226<网络攻防> Exp5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit : Exploit的英文意思就 ...

  3. 20155311《网络对抗》MSF基础应用

    20155311<网络对抗>MSF基础应用 实验过程 实验系统 靶机1:Windows XP Professional SP2 ,IP地址:192.168.136.129 靶机2:Wind ...

  4. CODE[VS] 1159 最大全0子矩阵

    写一道CODEVS的题目 其实我还是很喜欢CODEVS的界面的 主要是系统地学习一下悬线法这个看似十分简单,实际就是十分简单的算法 对于一些详细的东西参考dalao's blog,不喜勿喷 对于悬线法 ...

  5. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  6. stl源码剖析 详细学习笔记 配接器

    //---------------------------15/04/03---------------------------- /* 配接器概述: 1:adapter是一种设计模式:将一个clas ...

  7. 《Effective Java》学习笔记 ——异常

    充分发挥异常的优点,可以提高程序的可读性.可靠性和可维护性. 第57条 只针对异常的情况才使用异常 第58条 对可恢复的情况使用受检异常,对编程错误使用运行时异常 * 如果期望调用者能够适当的恢复,使 ...

  8. Docker_容器化gitlab

    Docker部署接口自动化持续集成环境第一步,容器化一个Gitlab! 1:开放防火墙端口 sudo yum install curl openssh-server openssh-clients p ...

  9. jenkins+maven+svn+npm自动发布部署实践

    一.系统版本centos7.6 二.根据jenkins官方安装方法yum安装jenkins 1.进入jenkins官网下载页面https://jenkins.io/download/,选择Red Ha ...

  10. Win10 + vs2017 编译并配置tesseract4.1.0

    tesseract 是一个开源的OCR (Optical Character Recognition , 光学字符识别) 引擎,本文就介绍一下自己在编译 tesseract4.1.0时遇到的一些坑,希 ...