【HDU-5963】朋友【树上博弈】
题意:
给定一棵树,树中每一条边有一个权值为0或者1,每次游戏需要找到一个点,满足该点到其父亲的边权为1,然后找到这个点到根节点的简单路径,将路径上所有边的权值翻转。
当一方无法操作时,另一方就获胜。
每次游戏有m个操作,0 x表示指定x为根节点,要求输出谁会赢;1 x y z表示将x和y之间的边修改为z。
思路:
本题乍一看还是有些难度的。但是仔细思考的话,可以找到一个化繁为简的方法。
可以看出一条边权如果为0,那么至少要翻转偶数次才能变为0;如果是1,那么至少要翻转奇数次才能变为0,因此我们可以只考虑根节点的边,不考虑图中其它的边。
对根节点直接导出的边权进行累加,如果和为偶数,那么后手胜,如果为奇数,那么先手胜。
注意:
本题存图方式很多,可以用 map<Point,int>,这种结构体的形式来存,也可以对两个点进行一下下类似哈希的操作。
如 map<long long,int> mp; mp[a*10000+b]表示<a,b>之间的边权,这些都是可以采用的方式。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int N = 4*1e4+100;struct Point{int x,y;
}tmp;
map<Point,int> mp;
int n,m;
int deg[N];bool operator < (Point a,Point b)
{if(a.x != b.x)return a.x < b.x; elsereturn a.y < b.y;
}int main()
{int T;scanf("%d",&T);while(T--){mp.clear();scanf("%d%d",&n,&m);rep(i,1,n) deg[i] = 0;rep(i,1,n-1){int x,y,z;scanf("%d%d%d",&x,&y,&z);if(z == 1){deg[x]++,deg[y]++;int a = min(x,y);int b = max(x,y);tmp.x = a; tmp.y = b;mp[tmp] = z;}}rep(i,1,m){int x;scanf("%d",&x);if(x == 0){int y;scanf("%d",&y);if(deg[y]%2 == 0) printf("Boys win!\n");else printf("Girls win!\n");}else{int x1,y1,z1;scanf("%d %d %d",&x1,&y1,&z1);int a1 = min(x1,y1);int a2 = max(x1,y1);tmp.x = a1; tmp.y = a2;if(mp[tmp] == 0 && z1 == 1) {mp[tmp] = z1; deg[a1]++; deg[a2]++;}else if(mp[tmp] == 1 && z1 == 0){mp[tmp] = 0; deg[a1]--; deg[a2]--;}}}}return 0;
}
【HDU-5963】朋友【树上博弈】相关推荐
- HDU 5963 朋友(找规律)
朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submiss ...
- hdu 6015 Gameia(树上博弈)
题目链接:hdu 6015 Gameia 题意: 给出一棵树,Alice 和 Bob 轮流操作, Alice先手, Alice的操作是选一个未染色的点将其染成白色,Bob的操作是选一个未染色的点将其染 ...
- HDU 6105 Gameia 树上博弈(思路题)(内附官方题解)
题目 :Gameia:链接 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) T ...
- Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)
Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...
- 51nod 1490: 多重游戏(树上博弈)
题目链接 该题实质上是一个树上博弈的问题.要定义四种状态--2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必败态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的 ...
- HDU 1525 类Bash博弈
给两数a,b,大的数b = b - a*k,a*k为不大于b的数,重复过程,直到一个数为0时,此时当前操作人胜. 可以发现如果每次b=b%a,那么GCD的步数决定了先手后手谁胜,而每次GCD的一步过程 ...
- hdu 2177 威佐夫博弈
题目链接:hdu 2177 威佐夫博弈水题,如果不是奇异局势需要输出走完第一步石堆的状态,先按两堆取相同石子,再按只取一堆. 可以打表解决 #include<iostream> #incl ...
- 【HDU - 5963】朋友(博弈,思维,必胜态必败态,找规律)
题干: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始, ...
- hdu 2149 巴什博弈
http://acm.hdu.edu.cn/showproblem.php?pid=2149 分析:就是巴什博弈的概念. 题目要求:对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价.两个 ...
- hdu 2188巴什博弈
http://acm.hdu.edu.cn/showproblem.php?pid=2188 分析:巴什博弈. View Code // I'm lanjiangzhou //C #include & ...
最新文章
- Linux下安装zookeeper集群(奇数个)
- html点击弹出iframe,JavaScript:关于跨iframe弹窗
- 推荐:26种NLP练手项目(代码+数据)
- 【Scala】Scala语言的介绍以及循环的定义(while,for,break,九九乘法表的计算代码)
- 如何在Ubuntu上安装SQL Server
- 查什么攻略?百行 Python 代码告诉你国庆哪些景点爆满!
- 2020-08-30
- 数据结构和算法——树结构(二叉树的创建、查找、遍历和删除)
- a4b5笔记本大小对比_【玩码】全新升级MX350独显 小米笔记本Pro 15 2020款为创造力而生...
- 微信公众号推送的模板消息无法跳转到小程序指定页面?
- C语言12之什么是字符串类型?
- xxl-job通过代码的方式动态添加任务,修改任务,执行任务,停止任务等
- 差分法求一阶导数二阶导数,matlab
- 【转】清华梦的粉碎 - 写给清华大学的退学申请
- 【转】【转】一个一年工作经验的java工程师从工作初到今天的所有收藏的学习java的网站(有些很经典...
- 字节跳动在Spark SQL上的核心优化实践
- Debug究竟是什么意思?
- 一些英文论文中的常用句式
- 20145204 张亚军《信息安全系统设计基础》第九周学习总结
- java+mysql 基于jsp810校园二手书交易系统
热门文章
- rownum与order by
- Lean Startup实战
- Bravo.Reporting:使用 .Net 实现基于 ODF 文档格式的报表系统
- tomcat设置独立jvm的例子
- 无法启动IE调试vs2008的一个解决办法
- redis详解_java 从零开始手写 redis(14)redis渐进式rehash详解
- 1091 Acute Stroke (30 分)广度优先搜索,用queue,重写一遍
- A[1062]德才论 好题
- 又见 Lucky Number
- python取余什么意思_基于python 取余问题(%)详解