You are given an unweighted, undirected graph. Write a program to check if it's a tree topology.

-----Input-----

The first line of the input file contains two integers N and M --- number of nodes and number of edges in the graph (0 < N <= 10000, 0 <= M <= 20000). Next M lines contain M edges of that graph --- Each line contains a pair (u, v) means there is an edge between node u and node v (1 <= u,v <= N).

-----Output-----

Print YES if the given graph is a tree, otherwise print NO.

-----Example-----
Input:
3 2
1 2
2 3

Output:
YES

Source: codechef | Difficulty: UNKNOWN_DIFFICULTY


Solutions:
def iscycle(E, v, EXPLORED_NODES, EXPLORED_EDGES):
	EXPLORED_NODES.add(v)
	r = False
	for e in [x for x in E if v in x]:
		if e in EXPLORED_EDGES:
			continue
		if e[0] == v:
			w = e[1]
		else:
			w = e[0]
		if w in EXPLORED_NODES:
			return True
		else:
			EXPLORED_EDGES.add(e)
			r = r or iscycle(E, w, EXPLORED_NODES, EXPLORED_EDGES)
			if r:
				break
	return r

def process(E):
	return iscycle(E, 1, set(), set()) and 'NO' or 'YES'

def main():
	(N, M) = list(map(int, input().split()))
	E = []
	for m in range(M):
		(U, V) = list(map(int, input().split()))
		if U > V:
			(U, V) = (V, U)
		E.append((U, V))
	print(process(E))
main()


def main():
	try:
		print('YES')
	except:
		return 0
main()


def main():
	try:
		[n, m] = input().split()
		m = int(m)
		n = int(n)
		p = [0] * (n + 1)
		while m > 0:
			[a, b] = input().split()
			a = int(a)
			b = int(b)
			p[a] = p[a] + 1
			p[b] = p[b] + 1
			if p[a] >= 3 or p[b] >= 3:
				print('NO')
				return 0
			m = m - 1
		print('YES')
	except:
		return 0
main()


import sys

def iter_dfs(G, s):
	(S, Q) = (set(), [])
	Q.append(s)
	p = Q.pop
	e = Q.extend
	t = S.add
	while Q:
		u = p()
		if u in S:
			continue
		t(u)
		e(G[u])
		yield u

def main():
	s = sys.stdin.readline
	(n, e) = list(map(int, s().split()))
	if e != n - 1:
		print('NO')
		return
	G = dict()
	for case in range(e):
		(n1, n2) = list(map(int, s().split()))
		if n1 not in G:
			G[n1] = [n2]
		else:
			G[n1].append(n2)
		if n2 not in G:
			G[n2] = [n1]
		else:
			G[n2].append(n1)
	tot = len(list(iter_dfs(G, 1)))
	if tot == n:
		print('YES')
	else:
		print('NO')

def __starting_point():
	main()
__starting_point()