def __init__( self, n_vertex, unconnected_probability=0 ):
		
		assert n_vertex >= 1

		self.__n_vertex   = n_vertex
		self._vertex_list = VertexDoubleLinkedList()
		self._LD          = self.__n_vertex # leading dimension
		self._adj_matrix  = [] # this is a simple python list
		# i'll use leadintng dimension to treat this as matrix
		
		# Generating vertex and push them into DLL
		for key in range( 0, self.__n_vertex ):
			self._vertex_list.insert( key )
		
		# Generate random adj_matrix
		for ii in range( 0, self.__n_vertex ):
			for jj in range( 0, self.__n_vertex ):
				r = randint( 0, unconnected_probability )
				
				if r is 0:
					self._adj_matrix.insert( ii * self._LD + jj, 1 )
				
				else:
					self._adj_matrix.insert( ii * self._LD + jj, 0 )

		return
class RandomGraph( object ):
	''' This class implements a random oriented graph G '''
	
	def __init__( self, n_vertex, unconnected_probability=0 ):
		
		assert n_vertex >= 1

		self.__n_vertex   = n_vertex
		self._vertex_list = VertexDoubleLinkedList()
		self._LD          = self.__n_vertex # leading dimension
		self._adj_matrix  = [] # this is a simple python list
		# i'll use leadintng dimension to treat this as matrix
		
		# Generating vertex and push them into DLL
		for key in range( 0, self.__n_vertex ):
			self._vertex_list.insert( key )
		
		# Generate random adj_matrix
		for ii in range( 0, self.__n_vertex ):
			for jj in range( 0, self.__n_vertex ):
				r = randint( 0, unconnected_probability )
				
				if r is 0:
					self._adj_matrix.insert( ii * self._LD + jj, 1 )
				
				else:
					self._adj_matrix.insert( ii * self._LD + jj, 0 )

		return


	def get_first_vertex( self):
		return self._vertex_list.search( 0 )


	def set_matrix_column_to_1( self, n_col ):
		for ii in range( 0, self.__n_vertex ):
			for jj in range( 0, self.__n_vertex ):
				if jj == n_col:
					self._adj_matrix[ ii * self._LD + jj] = 1
		return
		

	def set_matrix_sub_diag_to_1( self ):
		for ii in range( 0, self.__n_vertex ):
			for jj in range( 0, self.__n_vertex ):
				if ii == jj + 1:
					self._adj_matrix[ ii * self._LD + jj] = 1
		return


	def delete_white_vertices( self ):

		for vertex in self._vertex_list:
			if vertex.get_color() is "WHITE":
				self._vertex_list.delete( vertex.get_key() )
		return
	
	
	
	def get_neighbors_of_vertex( self, vertex ):
		# this is the returned list
		list_of_neighbors = []

		# assert that vertex exists
		self._vertex_list.search( vertex.get_key() )

		# begin scan - iterate over column
		vertex_key = vertex.get_key()
		for ii in range( 0, self.__n_vertex ):
			if self._adj_matrix[ ii * self._LD + vertex_key ] is 1:
				neighbor = self._vertex_list.search( ii )
				list_of_neighbors.append( neighbor )
		
		return list_of_neighbors
	
	

	def get_random_source_S( self ):
		
		length = self._vertex_list.length()
		random_index = randint( 0, length - 1 )
		
		i = 0
		for vertex in self._vertex_list:
			if i == random_index:
				return vertex
			i = i + 1
		
		return


	def show_adj_matrix( self ):
		
		for ii in range( 0, self.__n_vertex ):
			for jj in range( 0, self.__n_vertex ):
				print( str( self._adj_matrix[ ii * self._LD + jj ] ), 
					end=" ", flush=True)
			print( "" )
		return


	# Iterate over Graph vertices
	def __iter__( self ):

		for vertex in self._vertex_list:
			yield vertex

		return