题意:

给定一棵树,树中每一条边有一个权值为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】朋友【树上博弈】相关推荐

  1. HDU 5963 朋友(找规律)

    朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submiss ...

  2. hdu 6015 Gameia(树上博弈)

    题目链接:hdu 6015 Gameia 题意: 给出一棵树,Alice 和 Bob 轮流操作, Alice先手, Alice的操作是选一个未染色的点将其染成白色,Bob的操作是选一个未染色的点将其染 ...

  3. HDU 6105 Gameia 树上博弈(思路题)(内附官方题解)

    题目  :Gameia:链接 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  4. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  5. 51nod 1490: 多重游戏(树上博弈)

    题目链接 该题实质上是一个树上博弈的问题.要定义四种状态--2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必败态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的 ...

  6. HDU 1525 类Bash博弈

    给两数a,b,大的数b = b - a*k,a*k为不大于b的数,重复过程,直到一个数为0时,此时当前操作人胜. 可以发现如果每次b=b%a,那么GCD的步数决定了先手后手谁胜,而每次GCD的一步过程 ...

  7. hdu 2177 威佐夫博弈

    题目链接:hdu 2177 威佐夫博弈水题,如果不是奇异局势需要输出走完第一步石堆的状态,先按两堆取相同石子,再按只取一堆. 可以打表解决 #include<iostream> #incl ...

  8. 【HDU - 5963】朋友(博弈,思维,必胜态必败态,找规律)

    题干: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始, ...

  9. hdu 2149 巴什博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=2149 分析:就是巴什博弈的概念. 题目要求:对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价.两个 ...

  10. hdu 2188巴什博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=2188 分析:巴什博弈. View Code // I'm lanjiangzhou //C #include & ...

最新文章

  1. Linux下安装zookeeper集群(奇数个)
  2. html点击弹出iframe,JavaScript:关于跨iframe弹窗
  3. 推荐:26种NLP练手项目(代码+数据)
  4. 【Scala】Scala语言的介绍以及循环的定义(while,for,break,九九乘法表的计算代码)
  5. 如何在Ubuntu上安装SQL Server
  6. 查什么攻略?百行 Python 代码告诉你国庆哪些景点爆满!
  7. 2020-08-30
  8. 数据结构和算法——树结构(二叉树的创建、查找、遍历和删除)
  9. a4b5笔记本大小对比_【玩码】全新升级MX350独显 小米笔记本Pro 15 2020款为创造力而生...
  10. 微信公众号推送的模板消息无法跳转到小程序指定页面?
  11. C语言12之什么是字符串类型?
  12. xxl-job通过代码的方式动态添加任务,修改任务,执行任务,停止任务等
  13. 差分法求一阶导数二阶导数,matlab
  14. 【转】清华梦的粉碎 - 写给清华大学的退学申请
  15. 【转】【转】一个一年工作经验的java工程师从工作初到今天的所有收藏的学习java的网站(有些很经典...
  16. 字节跳动在Spark SQL上的核心优化实践
  17. Debug究竟是什么意思?
  18. 一些英文论文中的常用句式
  19. 20145204 张亚军《信息安全系统设计基础》第九周学习总结
  20. java+mysql 基于jsp810校园二手书交易系统

热门文章

  1. rownum与order by
  2. Lean Startup实战
  3. Bravo.Reporting:使用 .Net 实现基于 ODF 文档格式的报表系统
  4. tomcat设置独立jvm的例子
  5. 无法启动IE调试vs2008的一个解决办法
  6. redis详解_java 从零开始手写 redis(14)redis渐进式rehash详解
  7. 1091 Acute Stroke (30 分)广度优先搜索,用queue,重写一遍
  8. A[1062]德才论 好题
  9. 又见 Lucky Number
  10. python取余什么意思_基于python 取余问题(%)详解