根据欧拉定理,我们知道当一个无向图的奇点个数为 或 时它就可以被一笔画出。
另外这个题数据不保证图是联通的,并查集判断一下就好。
想简单地说说这个遍历的方法,奇点为 不用说,一条入边一条出边,总有办法遍历掉,如果有两个奇点,遍历的时候就必须以其中一个为起点,另一个为终点,否则不满足奇偶性。
#include<cstdio>
int init(){
char c = getchar();
int x = 0, f = 1;
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') f = -1;
for (; c >= '0' && c <= '9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
return x * f;
}
void print(int x){
if (x < 0) x = -x, putchar('-');
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
}
const int N = (int) 3e1 + 5;
int du[N], fa[N];
int find(int x){
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void merge(int u, int v){
u = find(u), v = find(v);
if (u < v) fa[v] = u;
else fa[u] = v;
}
int main(){
int T = init();
while (T--) {
int n = init(), m = init();
for (int i = 1; i <= n; ++i)
du[i] = 0, fa[i] = i;
for (int i = 1; i <= m; ++i) {
int u = init(), v = init();
++du[u], ++du[v];
merge(u, v);
}
int odd = 0;
for (int i = 1; i <= n; ++i)
odd += (du[i] & 1);
for (int i = 1; i <= n; ++i)
if (find(i) != 1)
odd += 4;
if (odd == 0 || odd == 2)
puts("Zhen");
else
puts("Xun");
}
}