思路:
1 #include <iostream> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <queue> 6 #include <cstdio> 7 #include <map> 8 using namespace std; 9 #define ll long long int 10 const int maxn=1e5; 11 int nod[40005];//nod[i]记录与点i相连的权值为1的边的数量 12 map<int,int> tree; 13 int main() 14 { 15 int T; 16 int n,m; 17 scanf("%d",&T); 18 while(T--) 19 { 20 tree.clear(); 21 memset(nod,0,sizeof(nod)); 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<n;i++){ 24 int x,y,z; 25 scanf("%d%d%d",&x,&y,&z); 26 if(z==1){ 27 nod[x]++; 28 nod[y]++; 29 tree[x*maxn+y]=1;//记录下两个点之间边的值 30 tree[y*maxn+x]=1; 31 } 32 } 33 while(m--) 34 { 35 int k; 36 scanf("%d",&k); 37 if(k==1){ 38 int x,y,z; 39 scanf("%d%d%d",&x,&y,&z); 40 if(z==1&&tree[x*maxn+y]==0)//如果原来两个点之间的边的值为0 41 { 42 nod[x]++; 43 nod[y]++; 44 tree[x*maxn+y]=tree[y*maxn+x]=1; 45 46 } 47 if(z==0&&tree[x*maxn+y]==1)//如果原来两个点之间的边的值为1 48 { 49 nod[x]--; 50 nod[y]--; 51 tree[x*maxn+y]=tree[y*maxn+x]=0; 52 } 53 } 54 else if(k==0) 55 { 56 int x; 57 scanf("%d",&x); 58 if(nod[x]&1) 59 printf("Girls win!\n"); 60 else 61 printf("Boys win!\n"); 62 } 63 } 64 } 65 return 0; 66 }