列表

详情


NC15518. 虚虚实实

描述

震为雷,临危不乱,亨通畅达;巽为风,柔顺伸展,厚载万物。
震卦:洊雷,震,君子以恐惧修省。一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知。
巽卦:随风,巽,君子以申命行事。一叶孤舟落沙滩,有篙无水进退难,时逢大雨江湖溢,不用费力任往返。 
算卦先生来问你,对于每个他给出的无向图,是否存在一条路径能够经过所有边恰好一次,并且经过所有点?不需要满足最后回到起点。 

输入描述

第一行一个数  ,表示有  组数据。对与每组数据,第一行有两个数 ,接下去  行每行两个数  描述一条无向边 。图不保证联通。

输出描述

对于每组数据,如果存在,输出  ,否则输出  。 

示例1

输入:

2
2 2
1 1
2 1
4 6
1 3
1 4
1 2
3 2
4 2
4 3

输出:

Zhen
Xun

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3(pypy3.6.1) 解法, 执行用时: 151ms, 内存消耗: 25284K, 提交时间: 2021-04-14 22:53:50

T=int(input())
while T>0:
    T-=1
    n,m=map(int,input().split())
    d=[[] for i in range(n)]
    while m>0:
        m-=1
        u,v=map(int,input().split())
        if u!=v:
            d[u-1].append(v)
            d[v-1].append(u)
    p=0
    for i in d:
        if len(i)%2==1:
            p+=1
    q=[1]
    haved=[1]
    while len(q)!=0:
        t=q.pop()
        for i in d[t-1]:
            if i not in haved:
                haved.append(i)
                q.append(i)
    if (p==2 or p==0) and len(haved)==n:
        print("Zhen")
    else:
        print("Xun")

Python3(3.5.2) 解法, 执行用时: 197ms, 内存消耗: 3688K, 提交时间: 2018-04-21 21:07:33

def f(a, i):
    if a[i] == -1:
        return i
    a[i] = f(a, a[i])
    return a[i]

T = int(input())
while T > 0:
    T -= 1
    n, m = map(int, input().split())
    d = [0] * n
    a = [-1] * n
    while m > 0:
        m -= 1
        u, v = map(int, input().split())
        d[u-1] += 1
        d[v-1] += 1
        if f(a,u - 1) != f(a, v - 1):
            a[f(a,u - 1)] = f(a, v - 1)
    c = 0
    for i in d:
        if i & 1:
            c += 1
    print('Zhen' if c <= 2 and sum([i==-1 for i in a]) == 1 else 'Xun')

C++11(clang++ 3.9) 解法, 执行用时: 8ms, 内存消耗: 488K, 提交时间: 2018-04-25 08:43:04

#include <stdio.h>
int a[100],s[100];
int zz(int k)
{
	while(k!=a[k])k=a[k];
	return k;
}
int main()
{
	int t,n,m,i,j,x,y,sum;
	scanf("%d",&t);
	while(t--)
	{
		for(i=0;i<100;i++)a[i]=i,s[i]=0;sum=0;
		scanf("%d%d",&n,&m);
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			int xx=zz(x);
			int yy=zz(y);
			s[x]++;s[y]++;
			if(xx!=yy)
				a[yy]=xx;
		}
		for(i=1;i<=n;i++)
		{
			if(zz(i)!=zz(1))break;
			sum+=s[i]%2;
		}
		if(sum<=2&&i==n+1)printf("Zhen\n");
		else printf("Xun\n");
	}
	return 0;
}

上一题