import sys
defmain(info, CaseNum):# info是一个字符串if info.strip()=='':print('Case {0} is a tree.'.format(CaseNum))return
lsInfo =list()
info = info.strip().split()
length =len(info)if length %2==1:print('输入的节点数量不是偶数!!!')returnfor i inrange(0,length-1,2):
lsInfo.append(info[i]+' '+info[i+1])# print("Case"+str(CaseNum),lsInfo)# return# EdgeSet存储边集合;InEdgeDict存储节点的入边;OutEdgeDict存储节点的出边
VertexSet, EdgeList, InEdgeDict, OutEdgeDict =set(),list(),dict(),dict()for item in lsInfo:
src, dst =map(int, item.split())# src --> dst
VertexSet.update({src,dst})if src == dst:# 表示存在自回路print('Case {0} is not a tree.'.format(CaseNum))return
EdgeList.append((src, dst))if src in OutEdgeDict:# src --> dst
OutEdgeDict[src].append(dst)else:
OutEdgeDict[src]=[dst]if dst in InEdgeDict:
InEdgeDict[dst].append(src)else:
InEdgeDict[dst]=[src]######################################## 检查|V|-1==|E|iflen(VertexSet)-1!=len(EdgeList):print('Case {0} is not a tree.'.format(CaseNum))return# 寻找根节点,计算入度1和入度0的节点,并检查根节点的出度不为0
root, rootNum =-1,0for vertex in VertexSet:
InEdges = InEdgeDict.get(vertex,list())iflen(InEdges)>1:print('Case {0} is not a tree.'.format(CaseNum))returneliflen(InEdges)==0:
root, rootNum = vertex, rootNum +1if rootNum !=1:print('Case {0} is not a tree.'.format(CaseNum))returneliflen(OutEdgeDict.get(root,list()))<1:print('Case {0} is not a tree.'.format(CaseNum))returnelse:print('Case {0} is a tree.'.format(CaseNum))if __name__ =='__main__':
infoList =list()for line in sys.stdin:
line = line.strip()if line =='':continue
line =list(map(str, line.split()))for s in line:ifint(s)>0:
infoList.append(s)elifint(s)==0:
infoList.append("#")
info =' '.join(infoList)
infoList = info[0:-4].split('# #')
CaseNum =0for info in infoList:
CaseNum +=1
main(info, CaseNum)