In [74]:
class Node:
    node_number = None
    neigbour = []
    is_visited = False
    
    def __init__(self, _node_number):
        self.node_number = _node_number
        self.neigbour = []
        self.is_visited = False

In [75]:
node_dict = {}
non_visited_dict = {}

In [76]:
def has_cycle(current_node, parent_node):
    current_node.is_visited = True
    non_visited_dict[current_node] = '1'
    
    for i in range(0, len(current_node.neigbour)):
        neigh_node = current_node.neigbour[i]
        
        if (neigh_node.is_visited == False):
            if (has_cycle(neigh_node, current_node)):
                return True
        elif (parent_node is not None and neigh_node.node_number != parent_node.node_number):
            return True
        elif (parent_node is None and neigh_node.node_number == current_node.node_number):
            return True
    return False

In [77]:
graph_property = map(int, raw_input().split())

no_nodes = graph_property[0]
no_edges = graph_property[1]

for i in range(0, no_nodes):
    number = i + 1
    node = Node(number)
    node_dict[number] = node

first_node = None

if (no_edges == 0 and no_nodes == 1):
    print "YES"
if (no_edges == 0 and no_nodes > 1):
    print "NO"
elif (no_nodes != no_edges +1):
    print "NO"
else:
    for i in range(0, no_edges):    
        neighbour_arr = map(int, raw_input().split())    
        a = neighbour_arr[0]
        b = neighbour_arr[1]

        node_a = node_dict[a]
        node_b = node_dict[b]

        if first_node is None: 
            first_node = node_a

        node_a.neigbour.append(node_b)
        node_b.neigbour.append(node_a)

    has_cycle = has_cycle(first_node, None)
    if has_cycle or len(non_visited_dict.keys()) != no_nodes:
        print "NO"
    else:
        print "YES"


3 1
NO


In [ ]:


In [ ]: