HDU 5963 朋友(找规律博弈)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5963 朋友(找规律博弈)相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=5963

题意:

 

思路:

我们可以先只考虑单链,自己试几种案例就可以发现规律,只有与根相连的边为1时,只需要奇数次操作,也就是1次就可以,而别的都需要偶数次操作才能把这条链上的边权全变成0,次数为$2^{n-1}$,n为边的层数。所以我们只要统计与根相连的有多少条权值为1的边即可。

需要改权值的时候搜索一下找到边然后修改。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 typedef long long ll;
13 typedef pair<int,int> pll;
14 const int INF = 0x3f3f3f3f;
15 const int maxn=40000+5;
16 
17 int n, m;
18 vector<pll> G[maxn];
19 
20 bool judge(int root)
21 {
22     int tmp=0;
23     for(int i=0;i<G[root].size();i++)
24     {
25         int v=G[root][i].first;
26         if(G[root][i].second==1)  tmp++;
27     }
28     if(tmp&1)  return true;
29     else return false;
30 }
31 
32 int main()
33 {
34     //freopen("in.txt","r",stdin);
35     int T;
36     scanf("%d",&T);
37     while(T--)
38     {
39         scanf("%d%d",&n,&m);
40         for(int i=1;i<=n;i++)  G[i].clear();
41         for(int i=1;i<n;i++)
42         {
43             int u,v,w;
44             scanf("%d%d%d",&u,&v,&w);
45             G[u].push_back(make_pair(v,w));
46             G[v].push_back(make_pair(u,w));
47         }
48         while(m--)
49         {
50             int op, root;
51             scanf("%d",&op);
52             if(op==0)
53             {
54                 scanf("%d",&root);
55                 if(judge(root))  puts("Girls win!");
56                 else puts("Boys win!");
57             }
58             else
59             {
60                 int u,v,w;
61                 scanf("%d%d%d",&u,&v,&w);
62                 for(int i=0;i<G[u].size();i++)
63                 {
64                     int vv=G[u][i].first;
65                     if(vv==v)  {G[u][i].second=w;break;}
66                 }
67                 for(int i=0;i<G[v].size();i++)
68                 {
69                     int uu=G[v][i].first;
70                     if(uu==u)  {G[v][i].second=w;break;}
71                 }
72             }
73         }
74     }
75     return 0;
76 }

 

以上是关于HDU 5963 朋友(找规律博弈)的主要内容,如果未能解决你的问题,请参考以下文章

最简单的博弈论——HDU - 5963 朋友 (博弈)

HDU 5963 朋友 博弈论 (中国大学生程序设计竞赛(合肥))

HDU 5963 博弈

[hdu-5795]A Simple Nim 博弈 尼姆博弈 SG函数打表找规律

HDU 4203 博弈 打表找规律

题解报告:hdu 1564 Play a game(找规律博弈)