vs做的网站图片显示不了,常州哪有做网站,求购做网站,一般网站建设都用什么字体正题
题目链接:https://www.luogu.com.cn/problem/P8347 题目大意
给出一棵树#xff0c;两个人轮流操作。
操作者可以选择一个点删除#xff0c;然后选择一个剩下的连通块#xff0c;删除其他连通块。
操作完成后只剩下一个点的人失败#xff0c;求是否先手必败。 1≤…正题
题目链接:https://www.luogu.com.cn/problem/P8347 题目大意
给出一棵树两个人轮流操作。
操作者可以选择一个点删除然后选择一个剩下的连通块删除其他连通块。
操作完成后只剩下一个点的人失败求是否先手必败。
1≤T≤5,1≤n≤1051\leq T\leq 5,1\leq n\leq 10^51≤T≤5,1≤n≤105 解题思路
考虑如果存在某个子树是先手必败的那么可以直接选择删这个点的父亲然后选择这个子树就先手必胜了。
所以如果先手必败那么肯定除了根节点以外所有点的子树都是先手必胜的。
然后此时考虑根节点的胜负情况那么每次操作的人肯定都会选择根节点的一个儿子的子树删除因为如果不这么做肯定会被另一个人偷鸡。
所以此时根节点的胜负取决于他儿子个数的奇偶性。
那么我们可以用同样的方法算出每个节点子树的胜负就可以了。
时间复杂度O(Tn)O(Tn)O(Tn) code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N1e510;
struct node{int to,next;
}a[N1];
int T,n,tot,ans,ls[N];
void addl(int x,int y){a[tot].toy;a[tot].nextls[x];ls[x]tot;return;
}
void dfs(int x,int fa){int sum0;for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa)continue;dfs(y,x);sum;}if(x!1)ans|(sum1);else ans|!(sum1);return;
}
int main()
{scanf(%d,T);while(T--){memset(ls,0,sizeof(ls));scanf(%d,n);totans0;for(int i1,x,y;in;i){scanf(%d%d,x,y);addl(x,y);addl(y,x);}dfs(1,0);if(ans)puts(Hifuu);else puts(Luna);}return 0;
}