hdu_5963_朋友(找规律)

时间:2022-11-08 10:20:37

题目链接:hdu_5963_朋友

题意:

中文,不解释

题解:

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

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll; const int N=;
int t,n,m,g[N],nxt[N],v[N],w[N],ed; void adg(int x,int y,int z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(g,,sizeof(g)),ed=;
F(i,,n-)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
adg(x,y,z),adg(y,x,z);
}
F(i,,m)
{
int op;
scanf("%d",&op);
if(op)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(int i=g[x];i;i=nxt[i])if(v[i]==y){w[i]=z;break;}
for(int i=g[y];i;i=nxt[i])if(v[i]==x){w[i]=z;break;}
}else
{
int x;
scanf("%d",&x);
int ans=;
for(int i=g[x];i;i=nxt[i])ans^=w[i];
if(ans&)puts("Girls win!");
else puts("Boys win!");
}
}
}
return ;
}