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

Difficulty: interview

Starter code:

Solutions:
#!/usr/bin/env python

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()