HDU 6105 Gameia(图上博弈)

题目链接

题意:

  有一棵树,所有的节点都是没有涂色的,Alice和Bob依次给没有涂色的节点涂色,Alice涂白色(先手),Bob涂黑色并且会把与这个黑色节点有树边直接相连的节点都涂成黑色(无论这个节点之前是白色还是没有涂色),Bob还有k次机会每次可以删掉一条树边(任何时候都可以执行),直到树上的所有节点都有涂色游戏结束。若树上至少有一个节点是白色Alice获胜,否则Bob获胜。

分析:

  Alice先涂一个白色节点,如果Bob想获胜,就必须找到一个未涂色的节点且该节点与白色节点有边相连(相当于每次出现一个白色节点,Bob就必须选一个与白色节点相连的没有涂色的节点涂黑色并把之前白色节点覆盖成黑色,如果Bob不这么做,Alice可以第一次找一个未涂色的叶子节点的直接前驱节点涂白,第二次涂之前白色节点的后继叶子节点就能获胜)。因此Alice一开始找一个叶子节点的直接前驱涂白,则Bob就变成只能把与白色节点直接相连的叶子节点涂黑色(如果Bob涂的是其他节点而不是叶子节点,Alice下次涂叶子节点就能获胜)。每进行一轮就把已经涂色的点遮掉(一对是黑色,一个匹配)剩下的就又是若干棵所有节点都未涂色的树(可能是孤立的节点),再执行上次的操作。问题就变成每两个有直接边相连的一对节点组成一个匹配,所有节点是否都在某一个匹配中。显然奇数个节点一定无法满足前面那个条件,Alice获胜;偶数个节点若不能满足之前那个匹配条件,在某次遮掉一个匹配时会产生孤立节点,也是Alice获胜;如果偶数节点存在两两匹配的情况,而Bob的删边次数不足以把树分成两两的点对,Alice一定获胜,因为树分成两两匹配的点对,其中Alice可以迫使Bob把一个点对中的一个点P涂黑(假设点P与另个匹配A中的点Q相连,则匹配A中的Q被涂黑,匹配A的另一个点就失去匹配,最后会出现一个孤立点。

程序实现:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
const int N = 500 + 5;
vector<int> G[N];
bool mark, vis[N];

void dfs(int x, int fa)
{
    for (int i = 0; i < G[x].size(); i++)
        dfs(G[x][i], x);
    if (vis[x]) return;//当前节点已经匹配了
    else {
        if (vis[fa]) mark = 0;//当前节点没有匹配,其父节点匹配了,原树就不能两两匹配
        else vis[x] = vis[fa] = 1;//当前节点与其父节点匹配
    }
    return ;
}
int main()
{
    int T, n, k, fa;
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d", &n, &k);
        for (int i = 1; i <= n; i++) G[i].clear();
        for (int i = 2; i <= n; i++) {
            scanf("%d", &fa);
            G[fa].push_back(i);
        }
        if (n % 2) {
            puts("Alice");
            continue;
        }
        memset(vis, 0, sizeof(vis));
        mark = 1;//标记是否两两匹配
        dfs(1, 1);
        if (mark && n-1 - n/2 <= k) puts("Bob");
        else puts("Alice");
    }
    return 0;
}

  

时间: 2024-12-15 01:37:16

HDU 6105 Gameia(图上博弈)的相关文章

2017多校第6场 HDU 6105 Gameia 博弈

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6105 题意:Alice和Bob玩一个游戏,喷漆!现在有一棵树上边的节点最开始都没有被染色.游戏规则是: 1,Alice和Bob只能选择未被染色的节点染色,Alice染色成白色,Bob为黑色 2. Alice最先开始 3. Bob有k次机会可以把树上的线段剪断 4. 最后树上有白色Alice胜利,否则是Bob胜利 5,Bob染色的时候,与他相邻的节点被强制染成黑色. 解法:? 先考虑Alice胜利的情

HDU 2147 kiki&#39;s game(博弈图上找规律)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2147 题目大意:给你一个n*m的棋盘,初始位置为(1,m),两人轮流操作,每次只能向下,左,左下这三个方向移动,谁最后无法移动棋子就输掉比赛,问先手是否会获胜. 解题思路:简单题,P/N分析找规律,以(n,m)点为结束点推到起始点,如图: 发现每个田字格的状态都是一样的,因为(n,m)点一定时P态,所以可以得出规律:只有当(m%2==1&&n%2==1)时,先手才会输. 代码: 1 #incl

hdu 5001 概率DP 图上的DP

http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题  一则有一个点难以想到 二则就是编码有点难度. 这个题: 我一直的思路就是1-能到达i的概率 就是不能到达i的概率,然后三维方程巴拉巴拉,,,,把自己搞迷糊 正确做法: dp[k][j]   经过j步到达k点 并且不经过i点的概率 这么设的原因是,就可以求不能到达i点的概率了.   不能到达i点的概率就是segma(dp[v][j-1]

HDU 3249 Test for job (有向无环图上的最长路,DP)

 解题思路: 求有向无环图上的最长路,简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #define LL long long using namespace std; const int

HDU 1517 A Multiplication Game (博弈&amp;&amp;找规律)

A Multiplication Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3691    Accepted Submission(s): 2097 Problem Description Stan and Ollie play the game of multiplication by multiplying an in

Java企业微信开发_08_JSSDK多图上传

一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失败 1.2JS-SDK使用权限签名算法 1.2.1 签名生成规则如下: (1)参与签名的字段包括: noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) . (2)对所有待签名参数按照字段名的ASCII

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

ZOJ 3644 Kitty&#39;s Game (图上DP 约数)

哎-这一场就做了三个题目,全队倒数第一,简直是太弱了. A Kitty's Game (ZOJ 3644) 题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3644 题意: 给出一个有向图,每个节点有一个权值pi, 有一个人从1节点出发(其权值为1节点的权值),前往n号节点,每经过一个节点,他的权值就变成了他经过这个节点前的权值和这个节点权值的最小公倍数,如果他经过这个节点后权值不发生变化则他就不能经过这个节点

hdu 1525 Euclid&#39;s Game 博弈

Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2219    Accepted Submission(s): 1000 Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan