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 ...
随机推荐
- go语言将函数作为参数传递
Go语言函数作为参数传递,目前给我的感觉几乎和C/C++一致.非常的灵活. import "fmt" import "time" func goFunc1(f ...
- VMware Workstation 无法打开内核设备:\\Global\\vmx86
解决方法:win10系统,打开“服务”后右击选择使用管理员打开.然后在一大串服务中找到vm开头的服务项,全部都启动.重新启动vm就ok了(vm需要以管理员身份打开).不用复杂的代码!!
- Windows7下命令行使用MySQL
我在Win7下安装的MySQL版本是mysql-5.0.22-win32 1.在Win7环境下安装MySQL,关于安装方法可以参考文章: Win7系统安装MySQL5.5.21图解教程.win7安装M ...
- C# Winform DotNetBar控件之StyleManager
这个控件作用改变窗体样式 使用方法 拖拽一个styleManager到窗体 改变它的managerStyle,再把窗体的继承改成Office2007Form 最后一步窗体初始化控件前 改掉的Enabl ...
- Android的WebView通过JS调用java代码
做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录 ...
- !vtop 命令
这命令超级牛B ,用途是算内存所在屋里地址 !vtop 命令可以有两个参数,第一个参数是CR3 寄存器的值,第二个参数是要查询的虚拟地址是多少,比如 kd> !vtop 19001e0 7c80 ...
- python--面向对象:继承
继承是创建新类的方式,新建的类可以继承多个父类(python里),父类又称为基类和超类,新建的类又称为派生类和子类 如果没有基类,python默认继承object祖类,object是所有类的基类 一. ...
- 使用Kettle的命名参数动态执行作业
关于如何根据传入的不同参数,达到动态运行作业的目的,这里不介绍.只提供一个思路,就是不同的调度进程调度同一个Kettle文件时,传入了不同的参数,从而得到不同的数据. 如下图所示: 1. 先设置参数名 ...
- mac 如何卸载node和npm采坑之旅
因为本地npm一直报错,所以决定直接卸载node和npm,重新装.第一次卸载,具体咱也不会呀!能咋整呢,百度呗 茫茫百度中各种找呀,找到一个转载最多的方法 sudo npm uninstall npm ...
- nodejs 在MYSQL 数据库中插入和查询数据
插入前的数据库: 插入后的数据库: 输出结果: demo var mysql = require('mysql'); var connection = mysql.createConnection({ ...