*ë
8:í>c       s“      d  e  d „ Z  d e f d „  ƒ  YZ  d e f d „  ƒ  YZ  d e f d „  ƒ  YZ  d e f d	 „  ƒ  YZ  d
 f  d „  ƒ  YZ d S(   i
   c    sy     g  }  x\ t |  ƒ d  rI }  | i g  ƒ  x- t |  ƒ d  r }  | | i | ƒ qI Wq W
 | Sd  S(   Ni    (   s   matrizs   ranges   ns   is   appends   js   valor_padrao(   s   ns   valor_padraos   js   is   matriz(    (    s   Grafo.pys
   geraMatriz s   	 	 	s	   ErroGrafoc      s     RS(   N(    (    (    (    s   Grafo.pys	   ErroGrafo s   s   ArestaDuplicadac      s     RS(   N(    (    (    (    s   Grafo.pys   ArestaDuplicada s   s   ArestaDesconhecidac      s     RS(   N(    (    (    (    s   Grafo.pys   ArestaDesconhecida s   s   VerticeDesconhecidoc      s     RS(   N(    (    (    (    s   Grafo.pys   VerticeDesconhecido s   s   Grafoc      sò    d  Z    d d „ Z ( d „  Z 4 d „  Z C d „  Z R d „  Z V d „  Z _ d „  Z c d	 „  Z l e	 d
 „ Z
 ~ d d „ Z „ d „  Z ‹ d „  Z ” d „  Z   d d „ Z ª d „  Z µ d „  Z Â d „  Z Ê d „  Z RS(   sö   Uma classe que modela um grafo atraves de matriz de adjacencias.
	
	Lembrando, G=(V,E). O grafo eh grafo nao-direcionado.
	Na nossa representação de matriz de adj., um elemento M[i][j]==None
	representa a ausência de uma aresta entre os nós i e ji
   c    s;    " # | |  _ $ t | ƒ |  _ & d g | |  _ d S(   s€   Cria o grafo.
		
		O primeiro argumento eh o numero de vertices( n = |V| ).	
		Por default, o valor do numero de vertices eh 10.s   brancoN(   s   ns   selfs	   _Grafo__ns
   geraMatrizs   _Grafo__matrizs   _Grafo__cores(   s   selfs   n(    (    s   Grafo.pys   __init__ s   c    sO   ( * + | | j o , | } - | } n / | } 0 | } 1 | | f Sd S(   sd   Mapeia uma aresta (u,v) para uma posição (i,j) dentro
		da matriz de adjacencias ( que é triangular)N(   s   us   vs   is   j(   s   selfs   us   vs   js   i(    (    s   Grafo.pys   __mapeiaTriangular( s   			c    sf   4 8 : |  i | | ƒ \ } } ; y < |  i | | SWn% = t j
 o A t d ƒ ‚ n Xd S(   s˜   Obtem o valor de uma "aresta" na matriz.
		
		Função para tratamento direto da matriz de adj.
		Adicionalmente ela garante que o grafo é não-direcionados-   Voce forneceu um valor invalido como vertice.N(	   s   selfs   _Grafo__mapeiaTriangulars   us   vs   is   js   _Grafo__matrizs
   IndexErrors   VerticeDesconhecido(   s   selfs   us   vs   js   i(    (    s   Grafo.pys   __getAresta4 s   c    sh   C G I |  i | | ƒ \ } } J y K | |  i | | <Wn% L t j
 o P t	 d ƒ ‚ n Xd S(   sš   Modifica o valor de uma "aresta" na matriz
		
		Função para tratamento direto da matriz de adj.
		Adicionalmente ela garante que o grafo é não-direcionados-   Voce forneceu um valor invalido como vertice.N(
   s   selfs   _Grafo__mapeiaTriangulars   us   vs   is   js   pesos   _Grafo__matrizs
   IndexErrors   VerticeDesconhecido(   s   selfs   us   vs   pesos   js   i(    (    s   Grafo.pys   __setArestaC s   c    s   R S T |  i Sd S(   s%   Retorna o numero de vértices do grafoN(   s   selfs	   _Grafo__n(   s   self(    (    s   Grafo.pys   numeroVerticesR s   c    s8   V Y Z |  i | | ƒ t j	 o [ d Sn \ d Sd S(   sc   Verifica a existencia de uma aresta.

		Lanca uma exception caso os vertices informados nao existami   i    N(   s   selfs   _Grafo__getArestas   us   vs   None(   s   selfs   us   v(    (    s   Grafo.pys   existeArestaV s   c    s   _ ` a t  |  i ƒ Sd S(   s,   Retorna uma V, a lista de vertices do Grafo.N(   s   ranges   selfs	   _Grafo__n(   s   self(    (    s   Grafo.pys   listaVertices_ s   c    sf   c d e g  } f xF t |  i ƒ d f r0 } g |  i | | ƒ o h | i | ƒ n q$ Wj | Sd S(   s3   Retorna a lista de vertices adjacentes ao vertice ni    N(   s   adjs   ranges   selfs	   _Grafo__ns   is   existeArestas   vertices   append(   s   selfs   vertices   adjs   i(    (    s   Grafo.pys   listaAdjacenciac s   	 	c    sò   l n o g  } q | t j oy s xo |  i ƒ  d s r\ } t xP t d | d ƒ d t r6 } u |  i | | ƒ o v | i	 | | f ƒ n qS Wq1 WnP x xI |  i ƒ  d x r6 } y |  i | | ƒ o z | i	 | | f ƒ n qª W| | Sd S(   ss   Lista as arestas do grafo ou, caso seja dado um vertice
		como argumento, lista  as arestas que saem desse vertice.i    i   N(
   s   arestass   vertices   Nones   selfs   listaVerticess   is   ranges   js   existeArestas   append(   s   selfs   vertices   arestass   js   i(    (    s   Grafo.pys   listaArestasl s   	 	 	& 	i   c    sP   ~  |  i | | ƒ o € t d | | f ƒ ‚ n ‚ |  i | | | ƒ d  S(   Ns   A aresta (%i,%i) ja existe(   s   selfs   existeArestas   us   vs   ArestaDuplicadas   _Grafo__setArestas   peso(   s   selfs   us   vs   peso(    (    s   Grafo.pys   insereAresta~ s   c    s    „ ˆ ‰ |  i | | t ƒ d S(   s   Remove uma aresta.
		
		Caso a aresta nao exista, ele simplesmente ignora o pedido.
		Caso os vertices nao existam, uma exception eh lancada.N(   s   selfs   modificaArestas   us   vs   None(   s   selfs   us   v(    (    s   Grafo.pys   removeAresta„ s   c    sP   ‹ Ž  |  i | | ƒ o  |  i | | ƒ Sn ’ t d | | f ƒ ‚ d S(   sM   Retorna o pese de uma aresta.

		Caso ela não exista, uma exception é lancadas   A aresta (%i,%i) não existeN(   s   selfs   existeArestas   us   vs   _Grafo__getArestas   ArestaDesconhecida(   s   selfs   us   v(    (    s   Grafo.pys   obtemAresta‹ s   c    sS   ” ™ š |  i | | ƒ o › |  i | | | ƒ n  t d | | f ƒ ‚ d S(   sÓ   Modifica o peso de uma aresta.
		
		Colocar o valor de peso como None efetivamente remove a	aresta.
		Caso a aresta nao exista, uma exception eh lancada.
		Caso os vertices nao existam, uma exception eh lancada.s   A aresta (%i,%i) não existeN(   s   selfs   existeArestas   us   vs   _Grafo__setArestas   pesos   ArestaDesconhecida(   s   selfs   us   vs   peso(    (    s   Grafo.pys   modificaAresta” s   s   brancoc    s=     ¡ ¢ y £ | |  i | <Wn ¤ ¨ t d ƒ ‚ n Xd S(   s   Modifica a cor de um vértices-   Voce forneceu um valor invalido como vertice.N(   s   cors   selfs   _Grafo__coress   vertices   VerticeDesconhecido(   s   selfs   vertices   cor(    (    s   Grafo.pys   setCor  s
   c    s;   ª « ¬ y ­ |  i | SWn ® ² t d ƒ ‚ n Xd S(   s   Retorna a cor de um vértices-   Voce forneceu um valor invalido como vertice.N(   s   selfs   _Grafo__coress   vertices   VerticeDesconhecido(   s   selfs   vertice(    (    s   Grafo.pys   getCorª s
   c    s¬   µ ¶ · d } ¸ | i d ƒ GH¹ x‚ t |  i ƒ d ¹ rl } º xX t |  i ƒ d º rB } » |  i | | ƒ o ¼ d |  i | | ƒ Gn ¾ d d GqS W¿ d GHq5 Wd S(	   s   Imprime a matriz de adj.s,   -=- -=- -=- Matriz de Adjacência -=- -=- -=-iH   i    s    %3i s    %3s s   -s    N(	   s   titulos   centers   ranges   selfs	   _Grafo__ns   js   is   existeArestas   obtemAresta(   s   selfs   js   titulos   i(    (    s   Grafo.pys   imprimeMatrizAdjµ s   	 	 	c    ss   Â Ã Ä t  |  i ƒ } Å xJ |  i ƒ  d Å r7 } Æ | \ } } Ç | i | | |  i	 | | ƒ ƒ q* WÈ | Sd S(   s   Retorna uma copia desse grafoi    N(
   s   Grafos   selfs	   _Grafo__ns   gs   listaArestass   es   us   vs   insereArestas   obtemAresta(   s   selfs   us   vs   gs   e(    (    s   Grafo.pys   copyÂ s    	&c    s×   Ê Í Î |  i ƒ  } Ï t } Ñ t | ƒ d j o Ò t Sn Õ | i ƒ  } Ö | \ } } × |  i
 | | ƒ } Ù xT | d Ù rG } Ú | \ } } Û |  i
 | | ƒ } Ü | | j o Ý | } n q~ Wß | Sd S(   sJ   Retorna o valor da maior aresta.
		
		Retorna None caso não hajam arestas.i    N(   s   selfs   listaArestass   arestass   Nones   maiors   lens   pops   es   us   vs   obtemArestas   valor(   s   selfs   maiors   arestass   vs   us   valors   e(    (    s   Grafo.pys   obtemMaiorArestaÊ s   	 	(   s   __doc__s   __init__s   _Grafo__mapeiaTriangulars   _Grafo__getArestas   _Grafo__setArestas   numeroVerticess   existeArestas   listaVerticess   listaAdjacencias   Nones   listaArestass   insereArestas   removeArestas   obtemArestas   modificaArestas   setCors   getCors   imprimeMatrizAdjs   copys   obtemMaiorAresta(    (    (    s   Grafo.pys   Grafo s&   	
			
N(   s   Nones
   geraMatrizs	   Exceptions	   ErroGrafos   ArestaDuplicadas   ArestaDesconhecidas   VerticeDesconhecidos   Grafo(   s	   ErroGrafos
   geraMatrizs   ArestaDesconhecidas   VerticeDesconhecidos   ArestaDuplicadas   Grafo(    (    s   Grafo.pys   ? s
   	