(HDU6105)Gameia(博弈+树的切割)
来源:互联网 发布:cordic算法看哪本书 编辑:程序博客网 时间:2024/05/18 20:06
这道博弈题只要发现只有将这棵树切成两两一对的很多对才能使Bob获胜,其余情况都是Alice获胜,这道题最主要的就是如何判断这棵树能否切割成两两一对的多个组呢?
思路就是:把每一个节点当做根节点来看,这个根节点的子节点为根的子树的节点个数为奇数的子节点至多只能有一个,因为根节点只有一个,如果只有一个子树的节点数为奇数,那根节点可以去帮忙构成偶数个,但是如果超过一个子树的节点数为奇数,那就无法满足每一个子树节点数都为偶数了,也就无法实现切割了。实现思路分成递归和非递归两种,递归的思路和树形dp很相似,非递归版就是将子节点多余的节点返还给父节点,然后要保证每一个节点的数目不能超过2个,同时注意1位数根,从叶子节点往上走。
递归版:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <map>#include <set>#include <vector>#include <queue>#include <cmath>#include <bitset>using namespace std;const int MAXN = 505;vector<int> edge[MAXN];int siz[MAXN];bool flag = 0;void dfs(int v, int fa){ siz[v] = 1; int cnt = 0; for(int i = 0; i < edge[v].size(); ++i) { if(flag == 0) return; int u = edge[v][i]; if(u == fa) continue; dfs(u, v); siz[v] += siz[u]; if(siz[u] & 1) { cnt += 1; if(cnt > 1) { flag = 0; return; } } } return;}int main(){ int CASE; scanf("%d", &CASE); while(CASE--) { int n, k; scanf("%d%d", &n, &k); for(int i = 0; i <= n; ++i) edge[i].clear(); int x; for(int i = 2; i <= n; ++i) { scanf("%d", &x); edge[x].push_back(i); } if(n & 1) { printf("Alice\n"); continue; } flag = 1; dfs(1, -1); if(flag == 1 && n / 2 - 1 <= k) printf("Bob\n"); else printf("Alice\n"); } return 0;}
非递归版:
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>//a&3==a%4using namespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps=1e-8;const int maxn=1000;//须填写const int inf=0x3f3f3f3f;int fa[maxn];int siz[maxn];int main(){ int kase; int n,k; bool flag; scanf("%d",&kase); while(kase--) { mem(siz); mem(fa); flag=true; scanf("%d%d",&n,&k); for(int i=2;i<=n;i++) scanf("%d",fa+i); for(int i=1;i<=n;i++) siz[i]=1; for(int i=n;i>=1;i--) { if(siz[i]>=3) flag=false; siz[fa[i]]+=(siz[i]%2); } if(flag&&n%2==0&&k>=(n/2-1)) cout << "Bob" << endl; else cout << "Alice" << endl; } return 0;}
阅读全文
0 0
- (HDU6105)Gameia(博弈+树的切割)
- hdu6105 Gameia 2017多校第六场1010 树+博弈
- hdu6105-多校6&&博弈&图&思维-Gameia
- [hdu6105]Gameia
- HDU6105-Gameia
- 2017杭电多校第六场 1010 Gameia(博弈)HDU6105
- HDU6105 [2017duoxiaolianhe6] Gameia 博弈你个香蕉船
- hdu6105 Gameia 思维
- Hdu6105 Gameia(2017多校第6场)
- hdu6105(博弈)
- HDU 6105 Gameia(树+博弈)
- HDU_6105 Gameia 【博弈】
- HDU 6015 Gameia【博弈】
- HDU 6105 Gameia 博弈
- HDU 6105 Gameia【思维+博弈】
- HDU 6105 Gameia(思维博弈)
- hdu -- 6105 -- Gameia(博弈)
- HDU 6105 Gameia (博弈)
- 网页实现扫码录入,小问题记录
- Toolbar样式定制详解
- mysql编码问题以及中文乱码解决
- git 如何获取某一个人特定的tag的源码啊
- ListView使用技巧
- (HDU6105)Gameia(博弈+树的切割)
- HDU1754-线段树(点更新区间查询)-I Hate It
- 小Z的袜子(hose) HYSBZ
- 从微信AI首席顾问到金融文档智能,一位中科院计算机科学家AI产品化实践
- java的世界里,younggc与fullgc分别是在什么时候发生
- hdu6119 小小粉丝度度熊【尺取法(滑动窗口)】
- 数据结构 —— 二叉树(Python实现)
- JS较为健全的运动框架
- 第二十三篇:JAVA之IO流系统详解