[CODEVS 1036]商务旅行
【问题描述】
某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。
假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。
你的任务是帮助该商人计算一下他的最短旅行时间。
【输入】
输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。
下面N-1行,每行由两个整数a 和b (1<=a, b<=n; a<>b)组成,表示城镇a和城镇b有公路连接。
在第N+1行为一个整数M,下面的M行,每行有该商人需要顺次经过的各城镇编号。
【输出】
在输出文件中输出该商人旅行的最短时间。
【算法分析】
直接使用Tarjan离线LCA算法可以通过所有数据。
【程序代码】
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int g[30010][510],dis[30010],num[30010],point[30010],n,m,ans=0; 5 int fa[30010],que[30010][3]; 6 bool bo[30010]; 7 void buildtree(int u){ 8 for (int i=1;i<=num[u];i++) 9 if (!bo[g[u][i]]){ 10 bo[g[u][i]]=true; 11 dis[g[u][i]]=dis[u]+1; 12 buildtree(g[u][i]); 13 } 14 } 15 int find(int u){ 16 return fa[u]==u?u:fa[u]=find(fa[u]); 17 } 18 void tarjan(int u){ 19 bo[u]=true; 20 for (int i=1;i<=que[u][0];i++) 21 if (bo[que[u][i]]) ans+=dis[u]+dis[que[u][i]]-2*dis[find(que[u][i])]; 22 for (int i=1;i<=num[u];i++) 23 if (!bo[g[u][i]]){ 24 tarjan(g[u][i]); 25 fa[g[u][i]]=u; 26 } 27 } 28 int main(){ 29 memset(g,0,sizeof(g)); 30 memset(num,0,sizeof(num)); 31 memset(dis,0,sizeof(dis)); 32 memset(point,0,sizeof(point)); 33 memset(bo,0,sizeof(bo)); 34 memset(que,0,sizeof(que)); 35 scanf("%d",&n); 36 for (int i=1;i<=n;i++) fa[i]=i; 37 for (int i=1;i<n;i++){ 38 int x,y; 39 scanf("%d%d",&x,&y); 40 g[x][++num[x]]=y; 41 g[y][++num[y]]=x; 42 } 43 bo[1]=true; dis[1]=0; 44 buildtree(1); 45 scanf("%d",&m); 46 memset(bo,0,sizeof(bo)); 47 for (int i=1;i<=m;i++) { 48 scanf("%d",&point[i]); 49 if (i==1&&point[i]==1) continue; 50 else if (i==1&&point[i]!=1){ 51 que[point[i]][++que[point[i]][0]]=1; 52 que[1][++que[1][0]]=point[i]; 53 } 54 else{ 55 que[point[i]][++que[point[i]][0]]=point[i-1]; 56 que[point[i-1]][++que[point[i-1]][0]]=point[i]; 57 } 58 } 59 tarjan(1); 60 printf("%d",ans); 61 return 0; 62 }
声明:本文章系博主原创,未经允许请勿转载。
转载于:https://www.cnblogs.com/Double680/p/5370953.html
[CODEVS 1036]商务旅行相关推荐
- codevs——1036 商务旅行
1036 商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 某首都城市的商人要经常到各城镇 ...
- 倍增LCA code[vs]1036商务旅行
n个点用n-1条边连接,求两个点间的最短路 显然可以想到用floyd预处理,但复杂度过高 所以一些巨发明了LCA 为什么这类最短路问题要找最近公共祖先,这是一个显然的问题,最近公共祖先说简陋了就是在这 ...
- 《商务旅行》解题报告
<商务旅行>解题报告 by mps [题目描述] 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其 ...
- 【codevs1036】商务旅行,LCA练习
商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做, ...
- 中船嘉年华邮轮揭幕全新企业品牌标识;美国运通全球商务旅行完成对Expedia集团旗下易信达的收购 | 全球旅报...
厦门W酒店闪耀登"鹭" 全新感官盛宴耀然揭幕.万豪国际集团旗下W酒店宣布,厦门W酒店开业.厦门W酒店业主方为宝龙集团.酒店坐落于厦门时尚的东部商圈,毗邻厦门新落成的宝龙一城地标购物 ...
- 商务旅行代理服务市场现状研究分析-
辰宇信息咨询市场调研公司最近发布-<2022-2028中国商务旅行代理服务市场现状研究分析与发展前景预测报告 > 内容摘要 本文研究中国市场商务旅行代理服务现状及未来发展趋势,侧重分析在中 ...
- 商务旅行,保护个人信息安全,需要遵守的基本原则
最近两年,由于美国国土安全部和美国海关边境保卫局(CBP)加强海关个人电子设备搜查力度,导致很多个人信息安全意识淡漠的游客遭遇麻烦,其中有因为"不当"微信内容而被遣返的中国女留学生 ...
- codevs 1036
商务旅行 #include <cstdio> #include <cmath> #include <iostream> #define MAXN 30010usin ...
- python分段线性插值_[Python] 分段线性插值
利用线性函数做插值 每一段的线性函数: #Program 0.6 Linear Interploation import numpy as np import matplotlib.pyplot as ...
最新文章
- Go语言环境搭建(Windows+Linux)
- 理解卷积神经网络的局限
- 美国 . PacBio
- 基于SSM实现网上购物商城系统
- node --- 使用koa-router,让后端模块化
- 搭建nfs,实现linux之间共享存储
- PyG图神经网络框架学习--示例介绍
- Neutron的SDN化
- qtxlsx编译报错_Qt5安装Qxlsx模块,以及Qxlsx模块的简单使用,附资源例程下载
- ElasticSearch.js源码走一个大概
- SQL-26 (二次分组)汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count...
- 2022危险化学品生产单位安全生产管理人员考试试题模拟考试平台操作
- 2020年手机上最好的25种免费游戏
- VBA小模板,跨表统计的2种写法
- D3D11、D3D12开发中CreateSwapChain返回DXGI_ERROR_INVALID_CALL(0x887A0001)错误的坑
- 每周资讯 | 三星成为加拿大Telus5G设备供应商、高通发布骁龙690处理器、诺基亚与博通合作开发5G芯片……...
- AI算力碎片化:矩阵乘法的启示
- 如何将PDF文件转换成清晰的图片
- pycharm无限延长试用时间
- echarts柱状图的x轴(刻度、标签名、刻度线),y轴(单位、刻度线样式(虚线、实线、)、字体样式(颜色、大小),图例排列 、柱状宽度、颜色,柱状背景)完整的柱状图