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

LCA UESTC 92 Journey

 

题目传送门

题意:先给一棵树,然后有一条额外的边,问u走到v从现在最短的路走和原来不加边走的路节省了多少距离

分析:首先跑不加边的树的LCA,这样能求出任意两点的距离,那么现在x和y多连了一条边,如果能节省路程那一定是走了xy这条边,那么暴力枚举组合,比如求u到v,新边xy,ans = min (ans, min (dux + dxy + dyv, duy + dyx + dxv))

 

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

typedef long long ll;
const int N = 1e5 + 10;
const int D = 20;
const int INF = 0x3f3f3f3f;
struct Edge	{
	int v, w, nex;
	Edge (int v = 0, int w = 0, int nex = 0) : v (v), w (w), nex (nex) {}
}edge[N<<1];
int head[N], dep[N], rt[D][N];
int d[N];
int n, q, e;
int x, y, cost;

void init(void)	{
	memset (head, -1, sizeof (head));
	e = 0;
}

void add_edge(int u, int v, int w)	{
	edge[e] = Edge (v, w, head[u]);
	head[u] = e++;
}

void DFS(int u, int fa, int deep, int len)	{
	dep[u] = deep;	d[u] = len;	rt[0][u] = fa;
	for (int i=head[u]; ~i; i=edge[i].nex)	{
		int v = edge[i].v, w = edge[i].w;
		if (v == fa)	continue;
		DFS (v, u, deep + 1, len + w);
	}
}

int LCA(int u, int v)	{
	if (dep[u] < dep[v])	swap (u, v);
	for (int i=0; i<D; ++i)	{
		if ((dep[u] - dep[v]) >> i & 1)	{
			u = rt[i][u];
		}
	}
	if (u == v)	return u;
	for (int i=D-1; i>=0; --i)	{
		if (rt[i][u] != rt[i][v])	{
			u = rt[i][u];
			v = rt[i][v];
		}
	}
	return rt[0][u];
}

int solve(int u, int v)	{
	int lca = LCA (u, v);
	int ans = d[u] + d[v] - d[lca] * 2;

	int lca1 = LCA (u, x);
	int dux = d[u] + d[x] - d[lca1] * 2;

	int lca2 = LCA (u, y);
	int duy = d[u] + d[y] - d[lca2] * 2;

	int lca3 = LCA (v, x);
	int dvx = d[v] + d[x] - d[lca3] * 2;

	int lca4 = LCA (v, y);
	int dvy = d[v] + d[y] - d[lca4] * 2;

    int mn = min (dux + dvy + cost, duy + dvx + cost);
    if (mn > ans)	return 0;
    else	return ans - mn;
}

int main(void)	{
	int T, cas = 0;	scanf ("%d", &T);
	while (T--)	{
		init ();
        scanf ("%d%d", &n, &q);
        for (int u, v, w, i=1; i<n; ++i)	{
			scanf ("%d%d%d", &u, &v, &w);
			add_edge (u, v, w);
			add_edge (v, u, w);
        }
        scanf ("%d%d%d", &x, &y, &cost);
        DFS (1, -1, 0, 0);
        for (int i=1; i<D; ++i)	{
			for (int j=1; j<=n; ++j)	{
				rt[i][j] = rt[i-1][j] == -1 ? -1 : rt[i-1][rt[i-1][j]];
			}
        }
        printf ("Case #%d:\n", ++cas);
        for (int u, v, i=1; i<=q; ++i)	{
			scanf ("%d%d", &u, &v);
			printf ("%d\n", solve (u, v));
        }
	}

	return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4861585.html

相关文章:

  • jquery cookie
  • Android调用系统相机拍照保存照片很小解决方案
  • Caching with Instance Variables 缓存与实例变量
  • jsf初学解决faces 中文输入乱码问题
  • Java随机数生成原理
  • jvm参数详解,内存泄露解决
  • HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法
  • centos 7 修改默认运行级别
  • Python之继承
  • hbase学习笔记1——脚本简单总结
  • 第四次作业——个人作业——软件案例分析
  • iOS小技巧之UIImagePickerController实现头像选择
  • 批量添加tiptop账号(批量添加Linux账号)
  • layer官方演示与讲解(jQuery弹出层插件)
  • 2015年10月26日作业
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Elasticsearch 参考指南(升级前重新索引)
  • gcc介绍及安装
  • HomeBrew常规使用教程
  • HTML5新特性总结
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript HTML DOM
  • leetcode386. Lexicographical Numbers
  • MobX
  • node和express搭建代理服务器(源码)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 计算机在识别图像时“看到”了什么?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 数组大概知多少
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • #大学#套接字
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $.ajax()参数及用法
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (论文阅读40-45)图像描述1
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)h264中avc和flv数据的解析
  • (转)iOS字体
  • (转)Linux下编译安装log4cxx
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET LINQ 通常分 Syntax Query 和Syntax Method