*ë
	Vï>c       s¨     d  Z    d k Z  e d „ Z . d „  Z < e d „ Z A g  d „ Z T d d „ Z u d „  Z } d	 „  Z	 ˆ e
 d
 j o ‰ d Z Š e e ƒ Z n d S(   sY   GrafoUtils.py - Funções Auxiliares para o tratamento dos problemas do
trabalho prático #1Nc 
   s    
  d }	  t |  d ƒ }  | i ƒ  }  | i ƒ  }  xè  | d j o×  d G| GH | i d d ƒ \ } }  | i ƒ  }  | d j o  t
 | ƒ }	 n  | d j o
 | d	 j o  d
 | ‚ n  | d j o
 | d j o  d | ‚ n  | i ƒ  }  | i ƒ  } qE W! t i |	 ƒ } " x£ t |	 d ƒ d " rŒ } # | i ƒ  } $ | i ƒ  } % | i d |	 | d ƒ } & xE t | d |	 ƒ d & r+ } ' t
 | d ƒ | | | <( | d =q²WqUW* | i ƒ  , | Sd S(   sP   Retorna uma Matriz correspondente a encontrada num arquivo no
	formato da TSPLibi
   s   rs   EDGE_WEIGHT_SECTIONs   Linha >>s   :i   s	   DIMENSIONs   EDGE_WEIGHT_TYPEs   EXPLICITsW   Eu só sei tratar arquivos com EADGE_WEIGHT_TYPE do tipo EXPLICIT, e essa é do tipo '%s's   EDGE_WEIGHT_FORMATs	   UPPER_ROWsZ   Eu só sei tratar arquivos com EADGE_WEIGHT_FORMAT do tipo UPPER_ROW, e essa é do tipo '%s'i   i    s    N(   s   dims   opens   filenames   fhs   readlines   linhas   strips   splits   options   values   ints   Grafos
   geraMatrizs   matrizs   ranges   js   valoress   is   close(
   s   filenames   linhas   fhs   is   values   valoress   js   matrizs   options   dim(    (    s   GrafoUtils.pys   TSPLIB2Matriz s<   	  	 	c  	  s•   . 0 1 t  |  ƒ } 2 t i | ƒ } 5 x] t | ƒ d 5 rJ } 6 x> t d | d ƒ d 6 r$ } 7 | i | | |  | | ƒ q[ Wq9 W9 | Sd S(   sU   Converte uma matriz de adjacências Triangular Superior
	(sem diagonal) 	para um grafoi    i   N(	   s   lens   matrizs   dims   Grafos   grafos   ranges   is   js   insereAresta(   s   matrizs   js   is   dims   grafo(    (    s   GrafoUtils.pys   Matriz2Grafo. s    	 	&c    s   < > ? t  t |  ƒ ƒ Sd S(   sO   Retorna um grafo correspondente ao encontrada num arquivo no
	formato da TSPLibN(   s   Matriz2Grafos   TSPLIB2Matrizs   filename(   s   filename(    (    s   GrafoUtils.pys   TSPLIB2Grafo< s   c    s»   A F G |  i ƒ  } J xt t | d ƒ d J r] } K xQ t | d | ƒ d K r7 } L |  i | | ƒ o M | i | | f ƒ n qM Wq+ WO t	 | ƒ d j o P d Sn R d Sd S(   s³    Verifica se um grafo é completo.
	
	Opcionalmente você pode fornecer um array em 'faltam' onde as arestas
	que faltam serão inseridas. Supomos grafos não direcionados
	sem laços.i   i    N(
   s   grafos   numeroVerticess   ns   ranges   js   is   existeArestas   faltams   appends   len(   s   grafos   faltams   ns   js   i(    (    s   GrafoUtils.pys
   ehCompletoA s    	 	"i   c    s_  T [ ] d } _ t |  ƒ o ` d Sn c x#|  i ƒ  d c r} d | o d | GHn e xî |  i ƒ  d e rÛ } f | | j o
 g qn n h xµ |  i ƒ  d h r¢ } i | | j p
 | | j o
 j q£ n l |  i | | ƒ |  i | | ƒ |  i | | ƒ } o | | j o0 p | o p d | | | f GHn q | } n q£ Wqn Wq= Wr | Sd S(   s  Verifica se um grafo COMPLETO respeita a desigualdade triangular e,
	caso não respeite, qual é a diferença máxima encontrada.
	
	Retorna 0 se o grafo respeitar, e, caso contrário, a differenca máxima
	encontrada.
	
	o(n^3)... Testando todas as combinações mesmo...i    s   (%i,%i,%i) ofende!N(
   s   diff_maximas
   ehCompletos   grafos   listaVerticess   is   debugs   js   ks   obtemArestas   diff(   s   grafos   debugs   js   diff_maximas   diffs   is   k(    (    s   GrafoUtils.pys   respeitaDesigualdadeTriangularT s,   	 	
  	
 	
5
 c    sq   u v d } w xT t t |  ƒ ƒ d w r; } x |  | t j	 o! y | | i | |  | ƒ } n q$ W{ | Sd  S(   Ni    (   s   custos   ranges   lens   listas   us   Nones   grafos   obtemAresta(   s   listas   grafos   us   custo(    (    s   GrafoUtils.pys   custo_lista_paternidadeu s   	 	%c  	  sn   } ~ d }  xQ t t |  ƒ ƒ d  r8 } € | | i |  |  |  | d t |  ƒ ƒ } q$ Wƒ | Sd  S(   Ni    i   (   s   custos   ranges   lens   listas   is   grafos   obtemAresta(   s   listas   grafos   custos   i(    (    s   GrafoUtils.pys   custo_caminho} s   	 	#s   __main__s   ../brazil58.tsp(   s   __doc__s   Grafos   Nones   TSPLIB2Matrizs   Matriz2Grafos   TSPLIB2Grafos
   ehCompletos   respeitaDesigualdadeTriangulars   custo_lista_paternidades   custo_caminhos   __name__s   filenames   m(
   s   custo_lista_paternidades   respeitaDesigualdadeTriangulars   filenames   Matriz2Grafos   ms
   ehCompletos   custo_caminhos   Grafos   TSPLIB2Grafos   TSPLIB2Matriz(    (    s   GrafoUtils.pys   ? s   &!	