传送门https://vjudge.net/problem/LightOJ-1355
题解:树博弈变种,偶数权值没有贡献,只有奇数权值产生贡献,特判1的情况
AC代码:
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
const int maxn=1e3+5;
const ll inf=9223372036854775800;
//const int inf=1e9;
//const int mod=1e9+7;
struct node{
int next,to;
ll len;
}side[maxn*2];
int y[maxn],tot,sg[maxn];
void add_edge(int i,int j,int w){
side[tot].next=j;
side[tot].to=y[i];
side[tot].len=w;
y[i]=tot++;
}
void dfs(int now,int fa){
sg[now]=0;
for(int a=y[now];a!=-1;a=side[a].to){
int i=side[a].next;
if(i==fa)
continue;
dfs(i,now);
if(side[a].len==1)
sg[now]^=(sg[i]+1);
else
sg[now]^=(sg[i]^(side[a].len%2));
}
}
int main( )
{
int t,cnt=1;
scanf("%d",&t);
while(t--){
memset(y,-1,sizeof(y));
tot=0;
int n;
scanf("%d",&n);
for(int a=1;a<n;a++){
int i,j,w;
scanf("%d%d%d",&i,&j,&w);
add_edge(i,j,w);
add_edge(j,i,w);
}
dfs(0,-1);
printf("Case %d: ",cnt++);
if(sg[0]==0)
printf("Jolly\n");
else
printf("Emily\n");
}
}