Advertisement
desdemona

grafy grafy

Nov 2nd, 2015
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.55 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Grafy reprezentowane przy pomocy macierzy sąsiedztwa.
  5. class AdjacencyMatrix:
  6.  
  7.     # Wyjątek pojawiający się przy próbie konwersji z błędnej reprezentacji tekstowej.
  8.     class G6Error( Exception ): pass
  9.  
  10.     # Wyjątek pojawiający się przy próbie stworzenia grafu bez wierzchołków lub posiadającego > 63 wierzchołki.
  11.     class LimitError( Exception ): pass
  12.  
  13.     # Tworzy graf o podanej reprezentacji tekstowej (domyślnie: 1-wierzchołkowy graf pusty).
  14.     def __init__( self, text = "@" ):
  15.         self.fromString( text )
  16.  
  17.     # Zwraca liczbę wierzchołków grafu.
  18.     def order( self ): return self.__order
  19.  
  20.     # Dodaje do grafu nowy izolowany wierzchołek.
  21.     def addVertex( self ):
  22.         if self.__order == 63:
  23.             raise AdjacencyMatrix.LimitError( "Graf nie może mieć więcej niż 63 wierzchołki" )
  24.         for v in range( self.__order ):
  25.             self.__matrix[v] += [False]
  26.         self.__order += 1
  27.         self.__matrix += [ [False] * self.__order ]
  28.  
  29.     # Usuwa z grafu wskazany wierzchołek.
  30.     def deleteVertex( self, u ):
  31.         if self.__order == 1:
  32.             raise AdjacencyMatrix.LimitError( "Graf musi mieć wierzchołki" )
  33.         if type( u ) != int or u < 0 or u >= self.__order:
  34.             raise ValueError
  35.         del self.__matrix[u]
  36.         for v in range( self.__order - 1 ):
  37.             del self.__matrix[v][u]
  38.         self.__order -= 1
  39.  
  40.     # Zwraca informację o tym, czy podane wierzchołki sąsiadują z sobą.
  41.     def isEdge( self, u, v ): return self.__matrix[u][v]
  42.  
  43.     # Dodaje podaną krawędź.
  44.     def addEdge( self, u, v ):
  45.         if type( u ) != int or u < 0 or u >= self.__order:
  46.             raise ValueError
  47.         if type( v ) != int or v < 0 or v >= self.__order:
  48.             raise ValueError
  49.         self.__matrix[u][v] = self.__matrix[v][u] = True
  50.  
  51.     # Usuwa podaną krawędź.
  52.     def deleteEdge( self, u, v ):
  53.         if type( u ) != int or u < 0 or u >= self.__order:
  54.             raise ValueError
  55.         if type( u ) != int or u < 0 or u >= self.__order:
  56.             raise ValueError
  57.         self.__matrix[u][v] = self.__matrix[v][u] = False
  58.  
  59.     # Przekształca reprezentację tekstową grafu w graf.
  60.     def fromString( self, text ):
  61.         try:
  62.             t, k = iter( text ), 0
  63.             c = ord( next( t ) ) - 63
  64.             if c < 1 or c > 63:
  65.                 raise AdjacencyMatrix.G6Error( "niewłaściwa liczba wierzchołków: {0}".format( c ) )
  66.             self.__order = c
  67.             self.__matrix = [[False for v in range( c )] for u in range( c )]
  68.             for v in range( 1, self.__order ):
  69.                 for u in range( v ):
  70.                     if k == 0:
  71.                         c = ord( next( t ) ) - 63
  72.                         if c < 0 or c > 63:
  73.                             raise AdjacencyMatrix.G6Error( "zakazany znak o kodzie {0}".format( c + 63 ) )
  74.                         k = 6
  75.                     k -= 1
  76.                     if (c & (1 << k)) != 0:
  77.                         self.__matrix[u][v] = self.__matrix[v][u] = True
  78.         except StopIteration:
  79.             raise AdjacencyMatrix.G6Error( "niekompletny napis" )
  80.         try:
  81.             c = ord( next( t ) )
  82.             raise AdjacencyMatrix.G6Error( "nadmiarowy znak o kodzie {0}".format( c ) )
  83.         except StopIteration:
  84.             pass
  85.  
  86.     # Przekształca graf w reprezentację tekstową.
  87.     def __str__( self ):
  88.         text, k, c = chr( self.__order + 63 ), 5, 0
  89.         for v in range( 1,self.__order ):
  90.             for u in range( v ):
  91.                 if self.__matrix[u][v]:
  92.                     c |= (1 << k)
  93.                 if k == 0:
  94.                     text += chr( c + 63 )
  95.                     k, c = 6, 0
  96.                 k -= 1
  97.         if k != 5:
  98.             text += chr( c + 63 )
  99.         return text
  100.  
  101.     # Test równości dwóch reprezentacji grafów.
  102.     def __eq__( self, other ):
  103.         if self.__order != other.order():
  104.             return False
  105.         for v in range( 1, self.__order ):
  106.             for u in range( v ):
  107.                 if self.__matrix[u][v] != other.isEdge( u, v ):
  108.                     return False
  109.         return True
  110.  
  111.     # Test różności dwóch reprezentacji grafów.
  112.     def __ne__( self, other ):
  113.         if self.__order != other.order():
  114.             return True
  115.         for v in range( 1, self.__order ):
  116.             for u in range( v ):
  117.                 if self.__matrix[u][v] != other.isEdge( u, v ):
  118.                     return True
  119.         return False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement