首页 > 代码库 > uva 12033 - Game of CS(树形删边)
uva 12033 - Game of CS(树形删边)
题目链接:uva 12033 - Game of CS
题目大意:给定图,以0为根节点,每条边有一个长度,两个人轮流操作,每次为一条边上色,上一个单位长度,当一条边的颜色被涂满,则算作是减掉整段子树。判断先手是否必胜。
解题思路:SG定理,对于当前节点u,每次考虑字节点v,u-v边的长度为l
当l为1时:sg(u) ^= (sg(v) + 1)
当l为奇数时: 需要判断sg(v)奇偶性,奇数-1,偶数+1;
当l为偶数时:sg(u) ^= sg(v)
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int N, W[maxn][maxn];
vector<int> g[maxn];
int dfs (int u, int p) {
int ret = 0;
for (int i = 0; i < g[u].size(); i++) {
int& v = g[u][i];
if (v != p) {
int sg = dfs(v, u);
if (W[u][v] == 1)
ret ^= (sg+1);
else if (W[u][v]&1)
ret ^= (sg + (sg&1 ? -1 : 1));
else
ret ^= sg;
}
}
return ret;
}
int main () {
int cas, u, v, w;
scanf("%d", &cas);
for (int k = 1; k <= cas; k++) {
scanf("%d", &N);
for (int i = 0; i < N; i++)
g[i].clear();
for (int i = 1; i < N; i++) {
scanf("%d%d%d", &u, &v, &w);
g[u].push_back(v);
g[v].push_back(u);
W[u][v] = W[v][u] = w;
}
printf("Case %d: %s\n", k, dfs(0, -1) ? "Emily" : "Jolly");
}
return 0;
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。