【POJ No. 2114】 游船之旅 Boatherds

news2024/11/29 22:29:30

【POJ No. 2114】 游船之旅 Boatherds

北大OJ 题目地址

在这里插入图片描述

【题意】

河流总是形成一棵树(以村庄为节点),超过两条河流时可以在交叉路口汇入。游船的定价政策非常简单:两个村庄之间的每条河流都有一个价格(两个方向的价格相同),任意两个村庄之间的旅行价格都是唯一的。已知河流网络的描述,包括河段的价格和整数序列x 1 , …, xk 。对于每个xi ,都应该确定河网中是否存在一对村庄(a , b ),使得a 和b 之间的旅行价格恰好是xi 。

【输入输出】

输入:

输入包含多个测试用例,每个测试用例的第1行都包含单个整数N (1≤N ≤10^4 ),表示村庄数。接下来的N 行,第i 行描述村庄i ,包含以空格分隔的整数d 1 c 1 …dj cj …dki cki 0,dj 表示从村庄i 出发的河流直接流向的村庄编号,cj 表示村庄i 和dj 之间的旅行价格,2≤dj ≤N ,0≤cj ≤1000。村庄1在河流的源头。接下来的M (M≤100)行查询,第i 个查询包含单个整数xi (1≤xi ≤10^7 )。每个测试用例都由包含数字0的单行结束,整个输入由包含数字0的单行结束。

输出:

对每个测试用例,都输出M 行查询的答案。若在河网中存在两个价格为xi 的村庄,则输出“AYE”,否则输出“NAY”。在每个测试用例后面都单行输出“.”。

【样例】

在这里插入图片描述

【思路分析】

对测试用例的输入数据从上向下解释如下。

  • 6:表示6个村庄(节)点。
  • 2 5 3 7 4 1 0:表示1到2的价格为5,1到3的价格为7,1到4的价格为1。
  • 0:从2出发没有河流。
  • 5 2 6 3 0:表示3到5的价格为2,3到6的价格为3。
  • 0:从4出发没有河流。
  • 0:从5出发没有河流。
  • 0:从6出发没有河流。

构建的树形结构如下图所示。

在这里插入图片描述

查询结果如下。

  • 1:存在价格为1的两个村庄1-4,输出“AYE”。
  • 8:存在价格为8的两个村庄3-4,输出“AYE”。
  • 13:不存在价格为13的两个村庄,输出“NAY”。
  • 14:存在价格为14的两个村庄2-5,输出“”AYE。

这道题查询树上两点之间路径之和为k 的路径是否存在,可采用点分治解决。

【算法设计】

① 求树的重心root。

② 从树的重心root出发,统计每个节点到root的距离。

③ 对距离数组排序,以双指针扫描,统计以root为根的子树中满足条件的节点数。

④ 对root的每一棵子树v 都减去重复统计的节点数。

⑤ 从v 出发重复上述过程。

【举个栗子】

从一棵树的重心root出发,统计每个节点到root的距离,得到距离数组dep[]后,求两点之间路径之和为4的路径数。

① 例如,对距离数组排序(本数据与样例无关),结果如下图所示,然后以双指针扫描,统计以root为根的子树中两点之间路径之和为4的路径数。

在这里插入图片描述

② L =1,R =10,若dep[L ]+dep[R ]>4,则R --。

在这里插入图片描述

③ L =1,R =8,dep[L ]+dep[R ]<4,则L ++。

在这里插入图片描述

④ L =2,R =8,dep[L ]+dep[R ]=4。

在这里插入图片描述

⑤ dep[L ]≠dep[R ],令st=L ,ed=R ,分别查找左侧和右侧第1个不相等的数,然后累加和值,并更新L 和R 。和为4的路径数:sum+=(st-L )×(R -ed)=4,分别是2-7、2-8、3-7、3-8。

在这里插入图片描述

⑥ dep[L ]=dep[R ],说明[L , R ]区间的元素全部相等,两两相加等于k 的对数为n (n +1)/2,n =R -L 。3×2/2=3,和为4的路径有3条,分别是4-5、4-6、5-6。sum+3=7。

在这里插入图片描述

【算法实现】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=10005;
int cnt,n,k,ans,head[maxn];
int root,S,size[maxn],f[maxn],d[maxn],dep[maxn];
bool vis[maxn];

struct edge{
	int to,next,w;
}edge[maxn*2];

void add(int u,int v,int w){
	edge[++cnt].to=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}

void getroot(int u,int fa){//获取重心
    size[u]=1;
	f[u]=0;//删除u后,最大子树的大小 
    for(int i=head[u];i;i=edge[i].next){
    	int v=edge[i].to;
    	if(v!=fa&&!vis[v]){
            getroot(v,u);
            size[u]+=size[v];
       		f[u]=max(f[u],size[v]);
        }
	}    
    f[u]=max(f[u],S-size[u]);//S为当前子树总结点数 
    if(f[u]<f[root])
		root=u;
}

void getdep(int u,int fa){//获取距离
    dep[++dep[0]]=d[u];//保存距离数组 
    for(int i=head[u];i;i=edge[i].next){
    	int v=edge[i].to;
    	if(v!=fa&&!vis[v]&&d[u]+edge[i].w<=k){
    		d[v]=d[u]+edge[i].w;
            getdep(v,u);
		}
    }
}

int getsum(int u,int dis){ //获取u的子树中满足条件的个数
    d[u]=dis;
	dep[0]=0;
	getdep(u,0);
    sort(dep+1,dep+1+dep[0]);
    int L=1,R=dep[0],sum=0;
    while(L<R){
    	if(dep[L]+dep[R]<k)
			L++;
		else if(dep[L]+dep[R]>k)
			R--;
		else{
			if(dep[L]==dep[R]){//两端相等,区间中间也相等,n(n-1)/2
				sum+=(R-L+1)*(R-L)/2;
				break;
			}
			int st=L,ed=R;
			while(dep[st]==dep[L])//找左侧第一个不相等的数 
				st++;
			while(dep[ed]==dep[R])//找右侧第一个不相等的数
				ed--;
			sum+=(st-L)*(R-ed);
			L=st,R=ed;
		}	
	}
    return sum; 
}

void solve(int u){ //获取答案
    vis[u]=true;
	ans+=getsum(u,0);
    for(int i=head[u];i;i=edge[i].next){
    	int v=edge[i].to;
		if(!vis[v]){
			ans-=getsum(v,edge[i].w);
            root=0;
			S=size[v];
			getroot(v,u);
            solve(root);
		}
    }
}

int main(){
	
	int y,w;
	while(scanf("%d",&n)&&n){
		memset(head,0,sizeof(head));
		cnt=0;
        for(int i=1;i<=n;i++){
           while(scanf("%d",&y)&&y){
		   		scanf("%d",&w);
            	add(i,y,w);
				add(y,i,w);
		   }
        }
        while(scanf("%d",&k)&&k){
        	memset(vis,0,sizeof(vis));
        	f[0]=0x3f3f3f3f;
        	root=0;
			S=n;
			ans=0;
			getroot(1,0);
			solve(root);
			if(ans)
				printf("AYE\n");
			else
				printf("NAY\n");
		}
        printf(".\n");
    }
	
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

向现实「低头」,大众「调战略」

越来越多的汽车制造商&#xff0c;在修正自己的战略。 作为全球智能电动汽车领头羊&#xff0c;特斯拉针对欺诈指控为自己辩护&#xff0c;解释称其自动驾驶技术只是未能实现自己设定的目标&#xff0c;而不是误导消费者。2019年4月&#xff0c;其首席执行官埃隆马斯克声称&…

电脑技巧:推荐几款装机必备的软件

目录 1、火绒安全 2、Geek Uninstaller 卸载神器 3、Potplayer 4、Edge微软官方浏览器 5、Snipaste 截图神器 6、Everything 本地搜索神器 7、Honeyview 超好用的图片查看工具 8、Bandizip 解压缩工具 9、傲梅分区助手 分区必备神器 10、ToDesk 远程协助工具 11、剪…

数字化采购浪潮下,MRO工业品采购商城系统如何助力企业深化智能升级

工业品作为工程建设、机械制造等行业发展过程中不可缺少的一部分&#xff0c;市场前景十分广阔。根据艾瑞咨询数据显示&#xff0c;2020年我国工业品市场规模为10.6万亿元&#xff0c;其中MRO市场占比为20%。而在万亿规模下&#xff0c;我国工业品市场上下游存在诸多行业痛点&a…

(八)并发集合——阻塞队列

阻塞队列---BlockQueue BlockingQueue是带阻塞功能的队列&#xff0c;继承了Queue接口&#xff0c;当执行入队操作时&#xff0c;如果队列满了&#xff0c;则阻塞调用者&#xff1b;当执行出队操作时&#xff0c;如果队列是空的&#xff0c;也阻塞调用者。 public interface Bl…

RK3568平台开发系列讲解(Linux系统篇)内存映射与虚拟内存

🚀返回专栏总目录 文章目录 一、内存映射二、内存保护三、内存锁定3.1、锁定指定的内存段3.2、锁定进程的所有内存页沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章讲介绍几个对虚拟内存进行系统级控制的系统调用,合理使用它们,能极大地提高应用的执行效率,…

C++ Reference: Standard C++ Library reference: Containers: map: map: at

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/at/ 公有成员函数 <map> std::map::at mapped_type& at (const key_type& k); const mapped_type& at (const key_type& k) const;访问元素 返回对键k标识的元素的映射值的引用。 如…

1、CSS基础之初识

文章目录一、简介二、基础语法语法格式注释举个例子三、CSS的数值与单位颜色值长度值四、CSS样式类型内联式&#xff08;行内嵌&#xff09;内嵌式&#xff08;内部样式表&#xff09;外链式&#xff08;外部样式表&#xff09;五、文字排版六、格式化列表七、格式化链接八、We…

网络实验之RIPV2协议(一)

一、RIPV2协议简介 RIP (Routing Information Protocol) 路由协议是一种相对古老&#xff0c;在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP 采用距离向量算法&#xff0c;是一种距离向量协议。RIP-1是有类别路由协议&#xff08;Classful Routing Protocol&#x…

[R语言]RMarkdown: 入门与操作

Rmarkdown入门汇总 R Markdown介绍 RMarkdown为我们的数据分析创建一个清晰美观的报告&#xff0c;它能够包含代码&#xff0c;图&#xff0c;表&#xff0c;说明&#xff0c;查看的人能够很清楚地理解。 RMarkdown利用Markdown的语法&#xff0c;能够被方便的转成其他类型(…

超店有数推出TikTok达人批量触达工具,让海量达人同时带货不再是梦

近年来&#xff0c;TikTok的全球化步伐越来越快。作为全球知名的短视频应用&#xff0c;TikTok目前日活跃用户超过8亿。电子商务业务规模保持快速增长。今年TikTok Shop黑五大促已于11月28日正式收官&#xff0c;TikTok Shop在黑五大促期间GMV增长126%&#xff0c;订单量增长13…

汇编前四章学习笔记

汇编学习笔记&#xff08;by 小白奋斗ing&#xff09; 参考《汇编语言&#xff08;第三版&#xff09;》王爽著 1.基础知识 1.1 机器语言 二进制编码 1.2 汇编语言 1.3 汇编语言的组成 1.4进制表示符 二进制&#xff08;B&#xff09;&#xff0c;十六进制&#xff08;H&a…

2022计算机毕业设计选题推荐 - 计算机毕业设计题目大全

文章目录0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…

电脑怎么恢复数据?恢复数据的3个技巧分享

在日常工作或生活中&#xff0c;电脑都是不可或缺的工具和设备。电脑里面保存着很多文件数据&#xff0c;如果重要的数据文件丢失&#xff0c;那就很麻烦。如果电脑数据丢失&#xff0c;怎么恢复数据&#xff1f;让我们一起来看看下面的3个恢复电脑数据的技巧吧&#xff01; 数…

阿里最新分享 SpringCloudAlibaba 实战小抄(第五版),一代更比一代强

为什么要学习 SpringCloud Alibaba&#xff1f; Spring Cloud Alibaba 为分布式应用开发提供了一站式解决方案。它包含开发分布式应用程序所需的所有组件&#xff0c;可以轻松地使用 Spring Cloud 开发应用程序。 使用 Spring Cloud Alibaba&#xff0c;只需添加一些注解和少…

web前端期末大作业——用HTML+CSS做一个漂亮简单的电影主题网站

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

【Python百日进阶-数据分析】Day127 - plotly折线图:px.line()/go.Scatter()实例

文章目录四、实例4.1 px的折线图4.1.1 加拿大的预期寿命4.1.2 带有列编码颜色的折线图4.1.3 Dash中的折线图4.1.4 折线图中的数据顺序4.1.5 连通散点图4.1.6 带标记的折线图4.1.7 symbol参数可用于将数据字段映射到标记符号4.1.8 日期轴上的折线图4.1.9 Sparklines with Plotly…

HUAWEI内网最新发布了一份452页网络协议手册,GitHb百万收藏

网络协议 网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。 网络协议作为当下久经不衰的话题&#xff0c;如果你经常看一些CSDN&#xff0c;GitHub&#xff0c;开源中国等较大的程序员网站就可以发现 相关于网络协议的博文非常之多&#xff01; 想要学习…

机密计算能否阻止下一次加密抢劫?

©网络研究院 近几个月来&#xff0c;数十亿美元的加密货币被盗是可以避免的&#xff0c;而机密计算是安全修复的关键。 机密计算旨在隔离敏感数据&#xff0c;而不会将其暴露给系统的其余部分&#xff0c;因为它更容易受到入侵者的攻击。它通过使用基于硬件的安全飞地处…

《Linux运维实战:使用Percona XtraBackup物理备份与恢复Mysql数据》

一、Percona XtraBackup工具介绍 Percona XtraBackup是世界上唯一开源、免费的MySQL热备份软件&#xff0c;可为InnoDB和XtraDB数据库执行非阻塞备份。 参考官方&#xff1a;Percona XtraBackup 1.1、支持的存储引擎 Percona XtraBackup可与MySQL和Percona Server配合使用。它…

虹科教您 | 利用UBIQUITY路由器实现对PLC的远程控制——以西门子S7-1200为例

随着各种工业协议的发展&#xff0c;各个工厂将面临着需要实现多种不同协议以及设备互联的挑战&#xff0c;其中也包含传统的机器设备。为了能够顺应物联网的发展&#xff0c;大幅提高效率&#xff0c;降低成本和资源消耗&#xff0c;并最终实现将传统工业提升到智能化的新阶段…