题目描述

圣玛格丽特学园的一角有一个巨大、如迷宫般的花坛。大约有一个人这么高的大型花坛,做成迷宫的形状,深受中世纪贵族的喜爱。维多利加的小屋就坐落在这迷宫花坛的深处。某一天早晨,久城同学要穿过这巨大的迷宫花坛,去探望感冒的维多利加。

整个迷宫可以用N个路口与M条连接两个不同路口的无向通道来描述。路口被标号为1到N,每条通道有各自的长度。整个迷宫一定是连通的,迷宫中可能存在若干个环路,但是,出于美观考虑,每个路口最多只会属于一个简单环路。例如,图1所示的迷宫是非常美观的,但图2则不符合我们的描述,因为3号路口同属于两个简单环。

你需要回答多个这样的询问:假如久城处在路口x,维多利加的小屋处在路口y,久城最短需要走多少距离才能到达小屋?

输入数据

第一行2个整数N,M,表示迷宫花坛的路口数和通道数;

接下来M行,每行3个整数x,y,z,描述一条连接路口x与路口y,长度为z的通道;

再接下来1行包含一个整数Q,表示询问数量;

之后Q行,每行2个整数x,y,描述一个询问。

输出数据

对于每个询问输出一行一个整数,表示最短距离。

样例输入

4 4
1 2 1
2 3 2
1 3 2
3 4 1
2
2 4
1 3

样例输出

3
2

数据范围

对于30%30%的数据,N≤100N≤100;

另有30%30%的数据,保证N=MN=M;

对于100%100%的数据,1≤N≤100000,0≤Q≤200000,1≤x,y≤N,1≤z≤10001≤N≤100000,0≤Q≤200000,1≤x,y≤N,1≤z≤1000。

由于传题人比较懒,hack数据只需满足是一个仙人掌

题目分析

大家好,我是老A。我又回来了,我很不爽。我们维护这个图的强连通分量,因为SPFA会跑飞,我们用Tarjan算法,然后求LCA即可,这一题NOI第三题水平。我们可以用可持久化分块,也可以倍增树剖ST表。要是你想要用堆优化线段树,那你滚吧。

参考代码

我知道你们就等着看我的代码,那我只好给你看了。

#include<bits/stdc++.h>
using namespace std;
int n,m;
inline int abs(int x) {return x>?x:-x;}
int head[], next[], to[], tot=;
int scc=, dfn[],low[], DFN=;
vector<int> s[],son[];
int st[],stn=;
int fa[][],dep[],size[];
map<int,int> d[], f[];
int D[];
inline void add(int u, int v, int tw) {
++tot;
next[tot]=head[u];
head[u]=tot;
to[tot]=v;
if(f[u].find(v)==f[u].end())
f[u][v]=tw;
else f[u][v]=min(f[u][v], tw);
}
O2 inline int getdep(int x) {
if(fa[x][]==) dep[x]=;
if(dep[x]) return dep[x];
return dep[x]=getdep(fa[x][])+;
}
inline void init() {
memset(dep, , sizeof(dep));
for (int i=; i<=; ++i) {
for (int j=; j<=scc; ++j) fa[j][i] = fa[fa[j][i-]][i-];
for (int j=n+; j<=n*; ++j) fa[j][i] = fa[fa[j][i-]][i-];
}
for (int i=; i<=scc; ++i) getdep(i);
for (int i=n+; i<=n*; ++i) getdep(i);
}
int tx, ty;
O2 inline int lca(int x,int y) {
if(dep[x]<dep[y]) swap(x,y);
for(int j=; j>=; --j)
if(dep[fa[x][j]]>=dep[y]) x=fa[x][j];
if(x==y) return x;
for (int j=; j>=; --j)
if(fa[x][j] != fa[y][j]) x=fa[x][j], y=fa[y][j];
tx=x,ty=y;
return fa[x][];
}
O2 inline void tarjan(int x) {
low[x]=dfn[x]=++DFN;
st[++stn]=x;
for (int i=head[x]; i; i=next[i]) {
if(dfn[to[i]] != ) {
low[x] = min(low[x], dfn[to[i]]);
}else{
tarjan(to[i]);
if(low[to[i]]==dfn[x]){
++scc;
son[x].push_back(scc);
s[scc].push_back(x);
fa[scc][]=n+x;
int t;
do {
t=st[stn--];
s[scc].push_back(t);
fa[n+t][]=scc;
} while(t != to[i]);
}
low[x] = min(low[x], low[to[i]]);
}
}
}
O2 inline void pre(int x) {
vector<int>::iterator it,_it;
stn=;
for (int i=,sz=s[x].size(); i<sz; ++i) st[++stn]=s[x][i];
st[++stn]=s[x][];
for (int i=; i<stn; ++i) {
size[x] += f[st[i]][st[i+]];
if(i!=stn-) d[x][st[i+]]=d[x][st[i]]+f[st[i]][st[i+]];
}int s1=, t=stn-;
while(s1<=t) {
if(D[st[s1-]]+f[st[s1-]][st[s1]]<D[st[t+]]+f[st[t+]][st[t]]){
D[st[s1]]=D[st[s1-]]+f[st[s1-]][st[s1]];
++s1;
} else {
D[st[t]]=D[st[t+]]+f[st[t+]][st[t]];
--t;
}
}
for (it=s[x].begin(),it++; it!=s[x].end(); ++it)
for (_it=son[*it].begin(); _it!=son[*it].end(); ++_it) pre(*_it);
} char chh; int xx;
O2 inline int read() {
chh=getchar();xx=;
while(!isdigit(chh)) chh=getchar();
while(isdigit(chh)) {
xx=(xx<<)+(xx<<)+chh-'';
chh=getchar();
}
return xx;
} O2 int main() {
n=read(), m=read();
for (int i=, u, v, tw; i<=m; ++i) {
u=read(), v=read(), tw=read();
add(u, v, tw);
add(v, u, tw);
}
tarjan(); init();
vector<int>::iterator it;
for(it=son[].begin();it!=son[].end();it++)
pre(*it);
int T=read();
while(T--) {
int x, y;
x=read(), y=read();
int LCA=lca(n+x,n+y);
if(LCA>n) printf("%d\n", D[x]+D[y]-*D[LCA-n]);
else {
int ans = D[x]+D[y]-D[tx-n]-D[ty-n];
int tmp = abs(d[LCA][tx-n]-d[LCA][ty-n]);
ans+=min(tmp, size[LCA]-tmp);
printf("%d\n", ans);
}
}
return ;
}

代码分析

Tarjan不解释,我们用STL来记录这几个点,第一次知道map可以这样迭代。最后我们用vector跑LCA,输出的时候判断一下就好了。

PS:PS内容在下一期。。。

【Noip模拟 20160929】花坛迷宫的更多相关文章

  1. 【Noip模拟 20160929】选数

    题目描述 现在有一排共N个数,你需要从中选出恰好K个.选出K个数后,计算它们两两差值的绝对值的最小值S.你需要确定选出哪K个,才能最大化这个S. 输入数据 输入第一行两个正整数N.K,含义如上. 输入 ...

  2. 【Noip模拟 20160929】树林

    题目描述 现在有一片树林,小B很想知道,最少需要多少步能围绕树林走一圈,最后回到起点.他能上下左右走,也能走对角线格子. 土地被分成RR行CC列1≤R≤50,1≤C≤501≤R≤50,1≤C≤50,下 ...

  3. 【Noip模拟 20160929】划区灌溉

    题目描述 约翰的奶牛们发现山脊上的草特别美味.为了维持草的生长,约翰打算安装若干喷灌器. 为简化问题,山脊可以看成一维的数轴,长为L(1≤L≤1,000,000)L(1≤L≤1,000,000),而且 ...

  4. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  5. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  8. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  9. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

随机推荐

  1. /etc/profile ~/.bash_profile ~/.bashrc 等文件的执行过程 和 区别

    /etc/profile :系统的所有用户共享 ~/.bash_profile:仅针对当前用户有效 我的电脑只用于开发,因此全部配置/etc/profile 参考链接: https://blog.cs ...

  2. 快速排序的两种实现 -- 种轴partition : 比值partition(更精巧)

    实现1:种轴partition,not in place--取定枢轴,将小于等于枢轴的放到枢轴左边,大于枢轴的放到右边 # python algorithm en_2nd edition p125de ...

  3. windows openssh server 安装试用

    使用Windows的可能会知道win10 的已经包好了openssh 服务,但是对于其他机器win 7 windows 2008 ,就需要其他的方法了 还好powershell 团队开发了支持wind ...

  4. JAVA工程师面试题库

    这些都是从其他地方copy过来的,如有侵权的话,可以联系我下架.这期只有问题,后面我会整理答案再重新发出来. http://blog.csdn.net/jackfrued/article/detail ...

  5. paramiko实现上传目录

    使用paramiko上传目录,重点是上传的那个过程,想了一上午才想出来,可能有点奇葩,但是还是实现了这个功能 #!/usr/bin/python import paramiko import os d ...

  6. 深入理解CSS系列(一):理解CSS的盒子模型

    接触前端也有好几个年头了,但是,讲实话,对于CSS的理解真的是不敢恭维,相信很多同行也有类似的感受吧!这是为什么呢?因为我们都认为CSS太简单了,没有必要深入学习,果真如此?其实,只不过是自己图样图森 ...

  7. easyUI默认图标的使用

    使用格式如下: <table id="table" class="easyui-datagrid" style="width:600px;hei ...

  8. Jenkins 配置 FindBugs,Checkstyle,PMD 实现代码的静态检查 (14)

    一.插件介绍 FindBugs:静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.利用这个工具,就可以在不实际运行程序的情况对软件进行分析.它可以帮助改进代码的 ...

  9. Spring生态研习【四】:Springboot+mybatis(探坑记)

    这里主要是介绍在springboot里面通过xml的方式进行配置,因为xml的配置相对后台复杂的系统来说,能够使得系统的配置和逻辑实现分离,避免配置和代码逻辑过度耦合,xml的配置模式能够最大限度的实 ...

  10. 记一次nginx403错误

    同事开发微信小程序,小程序通过API接口调用我们的人脸比对API,但是一直是提示403,通过查看查看nginx日志,发现请求并没有转发出去,转发出去的请求,应该是301,重定向, 然后就开始在ngin ...