HDU 2874 /// tarjan离线求森林里两点的距离
题目大意:
在一个森林里 询问 u v 两点
若不能到达输出 "Not connected" 否则输出两点距离
https://blog.csdn.net/keyboarderqq/article/details/56842607
和求树上两点差不多
改变的是树上两点的vis标记改成了记录根节点
此时 继续搜时 判断vis未标记过 就改成了是否存在根节点
而 更新答案时 判断vis标记过 则改成了根节点是否与当前根节点相同
#include <bits/stdc++.h>
#define mem(i,j) memset(i,j,sizeof(i))
using namespace std; const int N=1e4+, Q=1e6+;
struct EDGE {
int to, w, nt;
}e[N<<], q[Q<<];
int head[N], tot, que[N], pos;
///和HDU2586一样的毒 询问开N 如果开Q会MLE
int fa[N], dis[N], root[N];
int n, m, t, ans[Q]; void init() {
tot=; mem(head,);
pos=; mem(que,);
mem(root,); mem(ans,-);
}
void addE(int u,int v,int w) {
e[tot].to=v, e[tot].w=w;
e[tot].nt=head[u];
head[u]=tot++;
}
void addQ(int u,int v,int w) {
q[pos].to=v, q[pos].w=w;
q[pos].nt=que[u];
que[u]=pos++;
}
int getfa(int u) {
if(fa[u]==u) return u;
return fa[u]=getfa(fa[u]);
}
void Tarjan(int u,int rt) {
fa[u]=u; root[u]=rt;
for(int i=head[u];i;i=e[i].nt) {
int v=e[i].to;
if(!root[v]) {
dis[v]=dis[u]+e[i].w;
Tarjan(v,rt); fa[v]=u;
}
}
for(int i=que[u];i;i=q[i].nt) {
int v=q[i].to;
if(root[v]==rt)
ans[q[i].w]=dis[u]+dis[v]-*dis[getfa(v)];
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&t)) {
init(); for(int i=;i<m;i++) {
int u,v,w; scanf("%d%d%d",&u,&v,&w);
addE(u,v,w); addE(v,u,w);
}
for(int i=;i<=t;i++) {
int u,v; scanf("%d%d",&u,&v);
addQ(u,v,i), addQ(v,u,i);
} for(int i=;i<=n;i++)
if(!root[i]) {
dis[i]=;
Tarjan(i,i);
} for(int i=;i<=t;i++)
if(ans[i]==-) puts("Not connected");
else printf("%d\n",ans[i]);
} return ;
}
HDU 2874 /// tarjan离线求森林里两点的距离的更多相关文章
- HDU 2586 /// tarjan离线求树上两点的LCA
题目大意: 询问一棵树里 u 到 v 的距离 可由 dis[ u到根 ] + dis[ v到根 ] - 2*dis[ lca(u,v) ] 得到 https://blog.csdn.net/csyzc ...
- 【HDOJ2586】【Tarjan离线求LCA】
http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 2874 LCA离线算法 tarjan算法
给出N个点,M条边.Q次询问 Q次询问每两点之间的最短距离 典型LCA 问题 Marjan算法解 #include "stdio.h" #include "strin ...
- cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!
2450. 距离 ★★ 输入文件:distance.in 输出文件:distance.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 2874 Connections between cities(LCA离线算法实现)
http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...
- SPOJ 10628 Count on a tree(Tarjan离线LCA+主席树求树上第K小)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- SPOJ 10628 Count on a tree(Tarjan离线 | RMQ-ST在线求LCA+主席树求树上第K小)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- Tarjan算法离线 求 LCA(最近公共祖先)
本文是网络资料整理或部分转载或部分原创,参考文章如下: https://www.cnblogs.com/JVxie/p/4854719.html http://blog.csdn.net/ywcpig ...
随机推荐
- 穿过代理服务器取远程用户真实IP地址
public static string GetIP() { string str = ""; //穿过代理服务器取远程用户真实IP地址: if (System.Web.HttpC ...
- vscode gp 安装第三方包
由于code.google.com被墙,导致一些托管在code.google.com上面的包go get不下来,此功能就是用于解决这个问题. http://www.golangtc.com/downl ...
- RF中alert的处理
那么在robotframework中如何处理呢? 我在测试过程中遇到了这么一个窗口: 这种应该是属于Confirm 类型,是无法定位到的,在robotframework中需要这样处理: 1.虽然无法定 ...
- python正则re
import reline = "Catsaresmarterthandogs"matchObj = re.match( r'(.*)are(\w{2})(.*)', line, ...
- Maven项目上有小红叉咋办
Maven项目上有小红叉咋办 创建maven项目之后,war工程如果目录不全的话会出现错误.这种情况就是把目录补全就可以了. 这种情况版本问题,点击那个最新版本的,会自动给加一段代码.(如果没有就自己 ...
- (转)VS2015基础 指定一个或多个项目执行 - 心少朴的博客
慈心积善融学习,技术愿为有情学.善心速造多好事,前人栽树后乘凉.我今于此写经验,愿见文者得启发. 这个解决方案下,有两个项目, 看到黑体的project了吗?它就是指定执行的项目. 这两 ...
- 编码(RZ NRZ NRZI)
Frm: https://jingyan.baidu.com/album/39810a23addccbb637fda66a.html?picindex=1 RZ 编码(Return-to-zero C ...
- MySQL数据库(三)—— 表相关操作(二)之约束条件、关联关系、复制表
表相关操作(二)之约束条件.关联关系.复制表 一.约束条件 1.何为约束 除了数据类型以外额外添加的约束 2.约束条件的作用 为了保证数据的合法性,完整性 3.主要的约束条件 NOT NULL # ...
- Day 21 python :面向对象 类的相关内置函数 /单例模式 /描述符
1.isinstance(obj,cls) 检查obj是否是类cls的对象: 备注:用isinstance 的时候,产生实例后,会显示实例既是父类的实例,也是子类的实例 class Mom: gend ...
- 高级UI晋升之常用View(三)中篇
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从ViewPager来介绍常用View:文章目录 一.简介 二.基本使用 ...