首页 > 代码库 > hdu_5963_朋友(找规律)

hdu_5963_朋友(找规律)

题目链接:hdu_5963_朋友

题意:

中文,不解释

题解:

把样例拿出来看看,你会发现以x为节点是否能赢,就是与x相连的边权值的和或者异或是否为奇数。

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int N=80007;
 7 int t,n,m,g[N],nxt[N],v[N],w[N],ed;
 8 
 9 void adg(int x,int y,int z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;}
10 
11 int main()
12 {
13     scanf("%d",&t);
14     while(t--)
15     {
16         scanf("%d%d",&n,&m);
17         memset(g,0,sizeof(g)),ed=0;
18         F(i,1,n-1)
19         {
20             int x,y,z;
21             scanf("%d%d%d",&x,&y,&z);
22             adg(x,y,z),adg(y,x,z);
23         }
24         F(i,1,m)
25         {
26             int op;
27             scanf("%d",&op);
28             if(op)
29             {
30                 int x,y,z;
31                 scanf("%d%d%d",&x,&y,&z);
32                 for(int i=g[x];i;i=nxt[i])if(v[i]==y){w[i]=z;break;}
33                 for(int i=g[y];i;i=nxt[i])if(v[i]==x){w[i]=z;break;}
34             }else
35             {
36                 int x;
37                 scanf("%d",&x);
38                 int ans=0;
39                 for(int i=g[x];i;i=nxt[i])ans^=w[i];
40                 if(ans&1)puts("Girls win!");
41                 else puts("Boys win!");
42             }
43         }
44     }
45     return 0;
46 }
View Code

 

hdu_5963_朋友(找规律)