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 朋友 博弈论 (中国大学生程序设计竞赛(合肥))