当前位置: 首页 > news >正文

HDU ACM 2586 How far away ?LCA-gt;并查集+Tarjan(离线)算法

题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w。有m次询问,每次询问房子a,b之间的距离是多少。

分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次询问a。b之间的距离=d[a]+d[b]-2*d[LCA(a,b)];LCA(a,b)是a,b的近期公共祖先。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<vector>
using namespace std;

#define N 50005
vector<int> map[N],w[N],query[N],num[N];
int p[N],d[N],res[N];
bool vis[N];
int n;

void Init()
{
	int i;
	for(i=1;i<=n;i++)
	{
		map[i].clear();
		w[i].clear();
		query[i].clear();
		num[i].clear();
		p[i]=i;
		d[i]=0;
		vis[i]=false;
	}
}

int Find(int x)
{
	if(p[x]!=x)
		p[x]=Find(p[x]);
	return p[x];
}

void Union(int x,int y)
{
	x=Find(x);
	y=Find(y);
	if(x!=y)
		p[y]=x;
}

void Tarjan(int cur,int v)
{
	int size,i,tmp;

	vis[cur]=true;
	d[cur]=v;
	size=map[cur].size();
	for(i=0;i<size;i++)
	{
		tmp=map[cur][i];
		if(vis[tmp]) continue;
		Tarjan(tmp,v+w[cur][i]);
		Union(cur,tmp);
	}
	size=query[cur].size();
	for(i=0;i<size;i++)
	{
		tmp=query[cur][i];
		if(!vis[tmp])continue;
		res[num[cur][i]]=d[cur]+d[tmp]-2*d[Find(tmp)];
	}
}

int main()
{
	int T,q,a,b,c,i;

	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&q);
		Init();
		for(i=1;i<n;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			map[a].push_back(b);
			w[a].push_back(c);
			map[b].push_back(a);
			w[b].push_back(c);
		}
		for(i=0;i<q;i++)
		{
			scanf("%d%d",&a,&b);
			query[a].push_back(b);
			query[b].push_back(a);
			num[a].push_back(i);
			num[b].push_back(i);
		}
		Tarjan(1,0);
		for(i=0;i<q;i++)
			printf("%d\n",res[i]);
	}
	return 0;
}


相关文章:

  • php正则获取网页标题、关键字、网页描述代码
  • centos 6.4配置samba+ldap认证
  • 理解并取证:以太通道的动态协商机制的工作原理
  • Linux内核跟踪之trace框架分析【转】
  • 转 C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)...
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • Spring-AOP
  • Exchange2013下Telnet发送测试邮件失败及解决方案
  • 《FPGA全程进阶---实战演练》之搞定阻抗匹配
  • VI编辑常用命令
  • Redux系列x:源码分析
  • 12.28作业
  • 微信开发学习路线
  • ceph集群配置注意事项
  • AngularJs 父子级Controller传递数据
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • AWS实战 - 利用IAM对S3做访问控制
  • canvas 绘制双线技巧
  • centos安装java运行环境jdk+tomcat
  • Date型的使用
  • Java知识点总结(JavaIO-打印流)
  • Laravel5.4 Queues队列学习
  • Mysql数据库的条件查询语句
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node入门
  • python 装饰器(一)
  • 从0实现一个tiny react(三)生命周期
  • 从零搭建Koa2 Server
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 多线程事务回滚
  • 你不可错过的前端面试题(一)
  • 学习使用ExpressJS 4.0中的新Router
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ​马来语翻译中文去哪比较好?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1)SpringCloud 整合Python
  • (4)logging(日志模块)
  • (ZT)出版业改革:该死的死,该生的生
  • (九十四)函数和二维数组
  • (力扣题库)跳跃游戏II(c++)
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)Controller接口控制器详解(三)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)德国人的记事本
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .htaccess 强制https 单独排除某个目录
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net 验证控件和javaScript的冲突问题
  • .NET应用架构设计:原则、模式与实践 目录预览
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @JoinTable会自动删除关联表的数据
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116