[图论]游戏

news/2024/9/18 14:51:34/ 标签: 图论, 深度优先, , c++

题目描述

B B B 经常与 A A A 一起玩游戏。今天,他们在一棵上玩游戏。 A A A m 1 m1 m1 块石子, B B B m 2 m2 m2 块石子,游戏一开始,所有石头放在的节点处,除了根。

A A A 先移动石子。然后两人轮流移动,每次移动只能选择自己的一个石子,而且只能从当前位置移到父亲节点处,游戏过程中允许一个节点处放多个石子。

谁先把自己所有的石子移到根处谁就失败了,假设两人都是非常聪明,游戏过程中都使用最优策略,给定石子起始位置,要你计算出谁是赢家。

为了简化题目,假设根为 0 0 0

输入格式

输入包含多组测试数据。

第一行输入 T T T 表示测试数据组数。
接下来每组测试数据第一行输入 3 3 3 个整数 n n n, m 1 m1 m1, m 2 m2 m2 n n n的节点个数。
接下来 n − 1 n - 1 n1 行,每行包含两个整数 x , y x,y xy ( 0 ≤ x , y < n ) (0 \le x, y < n) (0x,y<n),表示中有一条边连接 x x x y y y
接下来 m 1 m1 m1 行,每行一个整数,表示 A A A 的石子的位置。
接下来 m 2 m2 m2 行,每行一个整数,表示 B B B 的石子的位置。

输出格式

对于每组数据,输出 A A A B B B 表示 A A A B B B 赢了。

数据范围

对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 10 1 \le n \le 10 1n10 1 ≤ m 1 , m 2 ≤ n 1 \le m1, m2 \le n 1m1,m2n
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1n104 1 ≤ m 1 , m 2 ≤ 1 0 4 1 \le m1,m2 \le 10^4 1m1,m2104

样例

输入:

2
3 1 1
0 1
2 0
1
2
3 2 1
0 1
1 2
2 2
2

输出:

B
A

思路

首先一眼看上去,似乎是个博弈题,但其实只是简单的

石子只能移到其根节点,且根节点只有一个,因此每个石子移到根节点的距离就能求出来。
A A A B B B 的每个石子离根节点的距离求出来相加,进行比较。

A A A 为先手,只有 s u m A > s u m B sum_A > sum_B sumA>sumB 时, A A A 才能赢,否则 B B B 赢。

比如 s u m A = s u m B = 1 sum_A = sum_B = 1 sumA=sumB=1 A A A 先走, B B B 再走, A A A 就不能走了, B B B 赢。

代码

#include<bits/stdc++.h>
using namespace std;
int T;
int n, m1, m2;
int dep[100010];//深度
int a[100010], b[100010];
vector<int> v[100010];//图
//x:当前节点 y:父亲节点 z:当前节点深度
void dfs(int x, int y, int z){dep[x] = z;for(auto i : v[x]){if(i == y){//父亲continue;}dfs(i, x, z + 1);}
}
int main(){scanf("%d", &T);while(T --){//多组数据清空memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(dep, 0, sizeof(dep));scanf("%d %d %d", &n, &m1, &m2); for(int i = 1; i < n; ++ i){int x, y;scanf("%d %d", &x, &y);v[x].push_back(y);v[y].push_back(x);}//将 a和b 每个位置的石子个数统计出来,方便以后计算for(int i = 1; i <= m1; ++ i){int x;scanf("%d", &x);a[x] ++;}for(int i = 1; i <= m2; ++ i){int x;scanf("%d", &x);b[x] ++;}//dfs 计算每个节点的深度dfs(0, -1, 0);int sum1 = 0, sum2 = 0;for(int i = 1; i <= n; ++ i){sum1 += a[i] * dep[i];}for(int i = 1; i <= n; ++ i){sum2 += b[i] * dep[i];}if(sum1 > sum2){printf("A\n");}else{printf("B\n");	}//v 在清空时注意要把 0 清了for(int i = 0; i <= n; ++ i){v[i].clear();}}return 0;
}

http://www.ppmy.cn/news/1517017.html

相关文章

Java学习Day31:HTML 第一章:观音禅院

1.结构介绍 1.标签的分类 <单词> &#xff1a;元素标签 <元素 单词>&#xff1a;首先<>中至少有两个单词&#xff0c;那第一个肯定是元素标签&#xff0c;元素标签后跟的都是属性标签 2.文本元素 段落元素 段落元素 换行标签 br 水平线标签 标签会在页面…

【石子合并】

题目 错解 #include <bits/stdc.h> using namespace std; const int N 310; int a[N], s[N], f[N][N]; int main() {int n;cin >> n;memset(f, 0x3f, sizeof f);for(int i 1; i < n; i){cin >> a[i];s[i] s[i-1] a[i];f[i][i] 0;}for(int i 1; i &…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习基础-Task1

# Datawhale AI 夏令营 夏令营手册&#xff1a;向李宏毅学深度学习 深度学习临界点 临界点&#xff1a;梯度为零的点 在神经网络训练过程中&#xff0c;当参数对损失微分为零的时候&#xff0c;梯度下降就不能再更新参数了&#xff0c;训练就停下来了&#xff0c;损失不再下…

Linux信号处理机制基础

什么是信号 信号在最早的UNIX系统中即被引入&#xff0c;已有30多年的历史&#xff0c;但只有很小的变化。信号是提供异步事件处理机制的软件中断。进程之间可以相互发送信号&#xff0c;这使信号成为一种进程间通信(Inter-ProcessCommunication,lPC)的基本手段 信号的名称与…

论文翻译:Multi-step Jailbreaking Privacy Attacks on ChatGPT

Multi-step Jailbreaking Privacy Attacks on ChatGPT https://arxiv.org/pdf/2304.05197 多步骤越狱隐私攻击对ChatGPT的影响 文章目录 多步骤越狱隐私攻击对ChatGPT的影响摘要1 引言2 相关工作3 对ChatGPT的数据提取攻击3.1 数据收集3.2 攻击制定3.3 从ChatGPT中提取私人数据…

Java——动态代理(2/2)-动态代理的应用场景和好处(原始模块、使用代理、测试执行)

目录 使用代理优化用户管理类 原始模块 使用代理 测试执行 解决实际问题、掌握使用代理的好处 使用代理优化用户管理类 场景 某系统有一个用户管理类&#xff0c;包含用户登录&#xff0c;删除用户&#xff0c;查询用户等功能&#xff0c;系统要求统计每个功能的执行耗…

MySQL和Hadoop

一、介绍 MySQL 针对结构化数据的存储、管理、查询 mysql和hadoop下的部分都是数据库&#xff0c;mysql用sql,hadoop用的是hiveql。&#xff08;大数据vs小数据&#xff09;&#xff08;结构化vs分布式&#xff09; Hadoop 定义&#xff1a;Hadoop 是一个开源的框架&#x…

小程序常用界面交互api

1. wx.showToast 显示消息提示框 显示一个消息提示框&#xff0c;一般用于操作成功后的提示 wx.showToast({title: 操作成功,icon: success,duration: 2000 });2. wx.showModal 显示模态弹窗 显示一个模态弹窗&#xff0c;可以用于提醒用户重要信息或让用户进行选择 wx.sho…

c++自定义迭代器,如跳表,怎么实现

在C中&#xff0c;跳表是一种高效的数据结构&#xff0c;用于存储有序数据并支持快速查找、插入和删除操作。为了在C类中实现跳表迭代器&#xff0c;你需要定义一个迭代器类&#xff0c;并在跳表类中提供相应的接口。以下是一个简单的实现示例&#xff1a; #include <iostr…

C++STL之list的使用详解

一、简介 1、底层&#xff1a;list为双向链表&#xff0c;即struct中包含一个数据和两个指针&#xff0c;分别指向前一个节点和后一个节点&#xff0c;在堆上分配空间&#xff0c;每插入一个元数都会分配空间&#xff0c;每删除一个元素都会释放空间 2、性能 ① 访问&#x…

【JPCS独立出版,EI稳定检索】2024年工业机器人与先进制造技术国际学术会议(IRAMT 2024,9月27-29)

2024年工业机器人与先进制造技术国际学术会议&#xff08;IRAMT 2024&#xff09;将于2024年9月27-29日在中国成都举办。 此次会议将围绕工业机器人、机电技术、机械及制造等领域的最新研究成果展开讨论&#xff0c;并广泛邀请了国内外领域内的著名专家与学者。会议旨在搭建一个…

序列化组件对比

1、msgpack介绍 1.MsgPack产生的数据更小&#xff0c;从而在数据传输过程中网络压力更小 2.MsgPack兼容性差&#xff0c;必须按照顺序保存字段 3.MsgPack是二进制序列化格式&#xff0c;兼容跨语言 官网地址&#xff1a; https://msgpack.org/ 官方介绍&#xff1a;Its lik…

【Python机器学习】NLP概述——深度处理

自然语言处理流水线的各个阶段可以看作是层&#xff0c;就像是前馈神经网络中的层一样。深度学习就是通过在传统的两层机器学习模型架构&#xff08;特征提取建模&#xff09;中添加额外的处理层来创建更复杂的模型和行为。 上图中&#xff0c;前四层对应于聊天机器人流水线中的…

<数据集>遥感船舶识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;15047张 标注数量(xml文件个数)&#xff1a;15047 标注数量(txt文件个数)&#xff1a;15047 标注类别数&#xff1a;25 标注类别名称&#xff1a;[Aircraft Carrier, Auxiliary Ships, Other Ship, Other Warship,…

【51单片机实物】基于51单片机设计的简易直流电机调测速系统(可用在普中开发板)——程序源码设计文档演示视频等(文末工程资料下载)

基于51单片机设计的简易直流电机调测速系统 演示视频 基于51单片机设计的简易直流电机调测速系统(可用在普中开发板) 功能任务描述:将设置的转速与当前测量的转速比较,得出差值用于控制DAC0832的输出电压,从而控制直流电机的转速,使转速逐渐达到设置转速。在LED上显示设…

【代码随想录训练营第42期 Day39打卡 - 打家劫舍问题 - LeetCode 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

目录 一、做题心得 二、题目与题解 题目一&#xff1a;198.打家劫舍 题目链接 题解&#xff1a;动态规划 题目二&#xff1a;213.打家劫舍II 题目链接 题解&#xff1a;动态规划 题目三&#xff1a;337.打家劫舍III 题目链接 题解&#xff1a;动态规划 三、小结 一、…

通过React实现萤石摄像头rtsp地址格式的视频流的web展示

首先&#xff0c;我们需要拿到rtsp格式的流地址&#xff08;rtsp://admin:[password][ip]&#xff09;&#xff0c;其中 password:设备底下的6位数验证码 ip:设备的ipv4地址 这里拿到ip的方式可以直连网线和绑定wifi两种方式 然后下载PC端的萤石工作室&#xff08;下载中心…

五、Centos7-安装Jenkins

目录 一、基础环境准备 1.安装JDK 2.安装Tomcat 二、安装Jenkins 1.配置Jenkins插件镜像源 2.问题&#xff1a;进入manager jenkins页面报错 3.配置Git 4.配置jdk 三、重新安装Jenkins 四、另一种Centos安装jenkins的方式--最终可用版 克隆了一个base的虚拟机&#x…

UnrealEngine学习(01):安装虚幻引擎

1. 下载安装 Epic Games 目前下载UE引擎需要先下载Epic Games&#xff0c;官网为我们提供了下载路径&#xff1a; https://www.unrealengine.com/zh-CN/downloadhttps://www.unrealengine.com/zh-CN/download 我们点击图中步骤一即可进行下载。 注释&#xff1a;Unreal Engi…

未初始化的变量

学习C语言局部变量&#xff0c;经常听到这个说法。为什么局部变量默认是未初始化的&#xff1f;解释它需要理解程序结构和栈操作。 栈内存 C/C函数的局部变量保存在栈&#xff0c;栈可以认为是操作系统为了“加速”程序运行给线程配置了一块临时使用的内存区域&#xff0c;如果…