codevs 1036 商务旅行 LCA 解题报告_Hawo11的博客-程序员宅基地

技术标签: codevs  LCA  ————单个题目———  ————数据结构————  

题目描述 Description

某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。

假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。

你的任务是帮助该商人计算一下他的最短旅行时间。

输入描述 Input Description

输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。下面N-1行,每行由两个整数a 和b (1<=a, b<=n; a<>b)组成,表示城镇a和城镇b有公路连接。在第N+1行为一个整数M,下面的M行,每行有该商人需要顺次经过的各城镇编号。

输出描述 Output Description

在输出文件中输出该商人旅行的最短时间。

样例输入 Sample Input

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

样例输出 Sample Output

7

思路

LCA即可,网上看到有树链剖分的题解,感觉用不上啊,直接LCA然后预处理一下。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=30000+5;
int n,m,deep[N],head[N],p[N][20],dis[N];
int x,y,a[N],num,ans;
struct edge 
{
    int next,v,w;
};
edge ed[N*4];
void build(int u,int v) 
{
    ed[++num].v=v;
    ed[num].w=1;
    ed[num].next=head[u];
    head[u]=num;
}
void dfs(int now,int val) 
{
    dis[now]=val;
    for (int i=head[now];i!=-1;i=ed[i].next)
    {
        int go=ed[i].v;
        if (deep[go]==0) 
        {
            deep[go]=deep[now]+1;
            p[go][0]=now;
            dfs(go,val+ed[i].w);
        }
    }
}
void init() 
{
    for (int j=1;(1<<j)<=n;j++)
    for (int i=1;i<=n;i++)
    if (p[i][j-1]!=0) p[i][j]=p[p[i][j-1]][j-1];
}
int lca(int a,int b) 
{
    if (deep[a]<deep[b]) swap(a,b);
    int i;
    for (i=0;(1<<i)<=deep[a];i++);
    i--;
    for (int j=i; j>=0; j--)
    if (deep[a]-(1<<j)>=deep[b]) a=p[a][j];
    if (a==b) return a;
    for (int j=i; j>=0; j--)
    if (p[a][j]!=0&&p[a][j]!=p[b][j]) a=p[a][j],b=p[b][j];
    return p[a][0];
}
int main() 
{
    memset(head,-1,sizeof(head));
    scanf("%d",&n);
    for (int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        build(x,y);
        build(y,x);
    }
    scanf("%d",&m);
    deep[1]=1;
    dfs(1,0);
    init();
    for (int i=1;i<=m;i++)
    scanf("%d",&a[i]);
    for (int i=2;i<=m;i++)
    {
        x=a[i-1],y=a[i];
        int find=lca(x,y);
        ans=ans+dis[x]+dis[y]-2*dis[find];
    }
    printf("%d",ans);
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Hawo11/article/details/77621577

智能推荐

预分配和多维内存_建立数据库能预分配存储空间大小吗_whitenpc的博客-程序员宅基地

堆和栈堆区内容需要手动释放,栈区不能手动释放。释放的化,会报错。malloc和new的区别1.new会自动分配空间,malloc需要手动分配空间且返回类型是void*需要自己区修改2.new,delete会调用析构构造函数,mallocfree不会3.new是从自由存储区获得内存,malloc从堆中获取内存;构造函数不能用virtual来写,析构可以加virtual,然后在析构的时候就会走子类析构。如果是指针指向一个一维数组,delete []p,得加个括号如果是个二维数组,_建立数据库能预分配存储空间大小吗

ORACLE DG概念及切换_一键切换dg的概念_Almeche的博客-程序员宅基地

DG的原理:DG分为物理standy,逻辑standy物理standy:物理STANDBY提供与主数据库完全一样的拷贝(块到块),数据库SCHEMA,包括索引都是一样的。它是直接应用REDO实现同步的。逻辑standy:逻辑STANDBY则不是这样,在逻辑STANDBY中,逻辑信息是相同的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO转换成SQL语句,..._一键切换dg的概念

SAP UI5 XML 视图里 label 和 text 控件文本对齐问题_sap ui5 text_汪子熙的博客-程序员宅基地

如下图所示,我直接将 SAP UI5 Label 和 Text 控件放在一起,最后的结果不令人满意:<Label text="Refresh Count:" labelFor="counter" /> <Text id="counter"/>Label 和 Text 并未在同一行显示:使用 HorizontalLayout 将Label 和 Text 包裹在一起,问题解决: <l:HorizontalLayout class="sapUiContent_sap ui5 text

《ROS全开源阿克曼转向智能网联无人驾驶车》开源教程(一)网络配置及移动控制_幻宇ros阿克曼小车资料在哪里下载_智能佳机器人的博客-程序员宅基地

编 制:智能佳 版 本: V1.0版权声明:该教程版权归北京智能佳科技有限公司所有,仅供大家交流学习,未经授权禁止引用、发布、转载等,否则将追究其法律责任。使用前说明:本使用文档说明略微简明,请结合指导视频进行操作会更容易理解!!第一章节 BJROBOT ROS 网络配置及移动控制1.工控机的系统用户名为 robot,密码:bjrobot远程登录方式:a.teamview, 输入工控机IP,密码即可登录; ..._幻宇ros阿克曼小车资料在哪里下载

UISegmentedControl详解_uni-segmented-control设置宽度_gf771115的博客-程序员宅基地

当用户输入不仅仅是布尔值时,可使用分段控件(UISegmentedControl)。分段控件提供一栏按钮(有时称为按钮栏),但只能激活其中一个按钮。分段控件会导致用户在屏幕上看到的内容发生变化。它们常用于在不同类别的信息之间选择,或在不同的应用屏幕之间切换。下面介绍基本属性和基本方法的使用。[代码]c#/cpp/oc代码:view sourceprint?_uni-segmented-control设置宽度

UVA11952 Arithmetic【进制】_海岛Blog的博客-程序员宅基地

Alice is really bad at arithmetic. Sometimes she can’t properly add two single-digit numbers withoutusing a computer! It is quite embarrassing, so she comes up with silly explanations when someone sp...

随便推点

python map函数 reduce函数_aman0907的博客-程序员宅基地

Python中map()函数浅析 函数式编程: 更好的描述问题map函数怎么理解当传入多个参数list时,map如何运作: abc函数第一次传入的数据时 (11,44,77),然后(22,55,88),然后(33,66,99)reduce函数reduce == '化简‘’reduce( func,...

C语言 文件I/O:实现结构体数据 存储到文件和从文件读取_Archer阿茶的博客-程序员宅基地

这是一个初步试验!是为了下一步的创建班级学生管理系统做准备ClassInfo.h源码#define MAX_STUDENT 50 //班级最大学生人数#define MAX_NAME_SPACE 30 //学生名称最大空间#define MAX_CLASS_NAME_SPACE 20 //班级名称最大空间#define MAX_ID_SPACE 20 //班级ID最大空间

linux下对SqlServer进行权限开放_sqlserver权限与linux权限_稻草人1123的博客-程序员宅基地

请教别人得到的,记录一下 首先进入你的数据库安装目录下,我的是root@uc60ums:~# cd /data/data/更改的一个配置文件postgresql.conf root@uc60ums:/data/data# vi postgresql.conf 进行搜索/listen更改第二个配置文件pg_hba.conf 改ip如下图 然后重启数据库即可_sqlserver权限与linux权限

Echarts源码修改_漏斗图梯形改矩形_echarts 沙漏图矩形_gt29的博客-程序员宅基地

目录Echarts漏斗图原效果目标效果解决方案Echarts漏斗图原效果这是Echarts中实现的funnel图的效果:可以看到,除了最后一个块是三角形,其他的块都是梯形。目标效果我想要得到的效果是每一块都像这样是矩形的。解决方案首先想到是在官方文档里找答案。看看有没有相关的参数可以修改来完成这种效果。但是很可惜,只找到了一种方法让最下面的三角形也变成梯形,没能找到让梯形变成矩形的参数。关于让三角形变成梯形,只需要在funnel图的series里设置minSize参数就可以了,默认_echarts 沙漏图矩形

kuka c2配置 输入输出_库卡c2配通讯-程序员宅基地

详细步骤见下1.接线我用的是这两个模块 一个输入 一个输出这俩模块的接线图见下_库卡c2配通讯

【组合数学】生成函数 ( 使用生成函数求解多重集 r 组合数 )_重集的r组合数_韩曙亮的博客-程序员宅基地

一、使用生成函数求解多重集 r 组合数 、二、使用生成函数求解多重集 r 组合数 示例_重集的r组合数

推荐文章

热门文章

相关标签