


'''simple docstring'''
# Author: OMKAR PATHAK, Nwachukwu Chidiebere

# Use a Python dictionary to construct the graph.
from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

UpperCAmelCase_ :     int								=      TypeVar('T')

class 						_lowerCamelCase					(    Generic[T]				):




 '''simple docstring'''


 def __init__(      self      ,      __lowercase = True						):

  """simple docstring"""







  __A  :		dict[T, list[T]]       =			{}  # dictionary of lists
  __A  :		Union[str, Any]       =			directed


 def  snake_case__   (      self      ,      __lowercase      ,      __lowercase						):

  """simple docstring"""







  if not self.directed:  # For undirected graphs
   # if both source vertex and destination vertex are both present in the
   # adjacency list, add destination vertex to source vertex list of adjacent
   # vertices and add source vertex to destination vertex list of adjacent
   # vertices.
   if source_vertex in self.adj_list and destination_vertex in self.adj_list:
    self.adj_list[source_vertex].append(__lowercase						)
    self.adj_list[destination_vertex].append(__lowercase						)
   # if only source vertex is present in adjacency list, add destination vertex
   # to source vertex list of adjacent vertices, then create a new vertex with
   # destination vertex as key and assign a list containing the source vertex
   # as it's first adjacent vertex.
   elif source_vertex in self.adj_list:
    self.adj_list[source_vertex].append(__lowercase						)
    __A  :		str       =			[source_vertex]
   # if only destination vertex is present in adjacency list, add source vertex
   # to destination vertex list of adjacent vertices, then create a new vertex
   # with source vertex as key and assign a list containing the source vertex
   # as it's first adjacent vertex.
   elif destination_vertex in self.adj_list:
    self.adj_list[destination_vertex].append(__lowercase						)
    __A  :		List[Any]       =			[destination_vertex]
   # if both source vertex and destination vertex are not present in adjacency
   # list, create a new vertex with source vertex as key and assign a list
   # containing the destination vertex as it's first adjacent vertex also
   # create a new vertex with destination vertex as key and assign a list
   # containing the source vertex as it's first adjacent vertex.
   else:
    __A  :		Optional[Any]       =			[destination_vertex]
    __A  :		Dict       =			[source_vertex]
  else:  # For directed graphs
   # if both source vertex and destination vertex are present in adjacency
   # list, add destination vertex to source vertex list of adjacent vertices.
   if source_vertex in self.adj_list and destination_vertex in self.adj_list:
    self.adj_list[source_vertex].append(__lowercase						)
   # if only source vertex is present in adjacency list, add destination
   # vertex to source vertex list of adjacent vertices and create a new vertex
   # with destination vertex as key, which has no adjacent vertex
   elif source_vertex in self.adj_list:
    self.adj_list[source_vertex].append(__lowercase						)
    __A  :		Optional[int]       =			[]
   # if only destination vertex is present in adjacency list, create a new
   # vertex with source vertex as key and assign a list containing destination
   # vertex as first adjacent vertex
   elif destination_vertex in self.adj_list:
    __A  :		Tuple       =			[destination_vertex]
   # if both source vertex and destination vertex are not present in adjacency
   # list, create a new vertex with source vertex as key and a list containing
   # destination vertex as it's first adjacent vertex. Then create a new vertex
   # with destination vertex as key, which has no adjacent vertex
   else:
    __A  :		List[str]       =			[destination_vertex]
    __A  :		Tuple       =			[]

  return self







 def __repr__(      self						):

  """simple docstring"""







  return pformat(self.adj_list						)










'''simple docstring'''
from collections.abc import Sequence


def 			_lowercase       (				UpperCamelCase__       :					Sequence[float],				UpperCamelCase__       :					float			):
 return sum(c * (x**i) for i, c in enumerate(UpperCamelCase__			)			)


def 			_lowercase       (				UpperCamelCase__       :					Sequence[float],				UpperCamelCase__       :					float			):
 __A  :		Optional[Any]       =			0.0
 for coeff in reversed(UpperCamelCase__			):
  __A  :		List[str]       =			result * x + coeff
 return result


if __name__ == "__main__":
 UpperCAmelCase_ :     Any								=      (0.0, 0.0, 5.0, 9.3, 7.0)
 UpperCAmelCase_ :     Any								=      10.0
 print(evaluate_poly(poly, x))
 print(horner(poly, x))






