Advertisement
desdemona

0.5% testów przeszło :D

Oct 27th, 2015
563
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.38 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. from ctypes import *
  5.  
  6.  
  7. # Grafy reprezentowane przy pomocy macierzy sąsiedztwa.
  8. class AdjacencyMatrix64bit:
  9.     # Wyjątek pojawiający się przy próbie konwersji z błędnej reprezentacji tekstowej.
  10.     class G6Error(Exception):
  11.         pass
  12.  
  13.     # Wyjątek pojawiający się przy próbie stworzenia grafu bez wierzchołków lub posiadającego > 10 wierzchołków.
  14.     class LimitError(Exception):
  15.         pass
  16.  
  17.     # Tworzy graf o podanej reprezentacji tekstowej (domyślnie: 1-wierzchołkowy graf pusty).
  18.     def __init__(self, text="@"):
  19.         self.__matrix = c_ulonglong(0)
  20.         self.__order = 1
  21.         self.fromString(text)
  22.  
  23.     # Zwraca liczbę wierzchołków grafu.
  24.     def order(self):
  25.         return self.__order
  26.  
  27.     # Dodaje do grafu nowy izolowany wierzchołek.
  28.     def addVertex(self):
  29.         if self.__order == 11:
  30.             raise AdjacencyMatrix64bit.LimitError("Graf nie może mieć więcej niż 11 wierzchołków")
  31.         for v in range(0, self.__order):
  32.             self.__matrix.value &= ~(1 << self.__indexInMatrix__(v, self.__order))
  33.         self.__order += 1
  34.         """
  35.        for v in range(self.__order):
  36.            self.__matrix[v] += [False]
  37.        self.__order += 1
  38.        self.__matrix += [[False] * self.__order]
  39.        """
  40.  
  41.     # Usuwa z grafu wskazany wierzchołek.
  42.     def deleteVertex(self, u):
  43.         if self.__order == 1:
  44.             raise AdjacencyMatrix64bit.LimitError("Graf musi mieć wierzchołki")
  45.         if type(u) != int or u < 0 or u >= self.__order:
  46.             raise ValueError
  47.         #wywala wszelkie krawedzie z tym wierzcholkiem
  48.         for v in range(0, self.__order):
  49.             if u != v:
  50.                 self.__matrix.value &= ~(1 << self.__indexInMatrix__(v, u))
  51.  
  52.         #wyzeruj temp
  53.         temp = c_ulonglong(0)
  54.         for i in range(1, self.__order):
  55.             for j in range(i):
  56.                 if j!= i:
  57.                     temp.value &= ~(1 << self.__indexInMatrix__(i, j))
  58.  
  59.         for i in range(0, self.__order):
  60.             for j in range(0, self.__order):
  61.                 if i == j:
  62.                     continue
  63.                 k = i
  64.                 l = j
  65.                 if k >= u:
  66.                     k -= 1
  67.                 if l >= u:
  68.                     l -= 1
  69.  
  70.                 if self.isEdge(i, j):
  71.                     temp.value |= (1 << self.__indexInMatrix__(k, l))
  72.  
  73.         self.__order -= 1
  74.         self.__matrix = temp
  75.  
  76.     # Zwraca informację o tym, czy podane wierzchołki sąsiadują z sobą.
  77.     def isEdge(self, u, v):
  78.         return (self.__matrix.value & (1 << self.__indexInMatrix__(u, v))) != 0
  79.  
  80.     # Dodaje podaną krawędź.
  81.     def addEdge(self, u, v):
  82.         if type(u) != int or u < 0 or u >= self.__order:
  83.             raise ValueError
  84.         if type(v) != int or v < 0 or v >= self.__order:
  85.             raise ValueError
  86.         self.__matrix.value |= (1 << self.__indexInMatrix__(u, v))
  87.  
  88.     # Usuwa podaną krawędź.
  89.     def deleteEdge(self, u, v):
  90.         if type(u) != int or u < 0 or u >= self.__order:
  91.             raise ValueError
  92.         if type(u) != int or u < 0 or u >= self.__order:
  93.             raise ValueError
  94.         #self.__matrix[u][v] = self.__matrix[v][u] = False
  95.         self.__matrix.value &= ~(1 << self.__indexInMatrix__(u, v))
  96.  
  97.     # Przekształca reprezentację tekstową grafu w graf.
  98.     def fromString(self, text):
  99.         try:
  100.             t, k = iter(text), 0
  101.             c = ord(next(t)) - 63
  102.             if c < 1 or c > 11:
  103.                 raise AdjacencyMatrix64bit.G6Error("niewłaściwa liczba wierzchołków: {0}".format(c))
  104.             self.__order = c
  105.             self.__matrix = c_ulonglong(0)
  106.             for v in range(1, self.__order):
  107.                 for u in range(v):
  108.                     self.__matrix.value &= ~(1 << self.__indexInMatrix__(v, u))
  109.             for v in range(1, self.__order):
  110.                 for u in range(v):
  111.                     if k == 0:
  112.                         c = ord(next(t)) - 63
  113.                         if c < 0 or c > 63:
  114.                             raise AdjacencyMatrix64bit.G6Error("zakazany znak o kodzie {0}".format(c + 63))
  115.                         k = 6
  116.                     k -= 1
  117.                     if (c & (1 << k)) != 0:
  118.                         #self.__matrix.value &= (1 << self.__indexInMatrix__(u, v))
  119.                         #self.__matrix[u][v] = self.__matrix[v][u] = True
  120.                         self.addEdge(u, v)
  121.  
  122.         except StopIteration:
  123.             raise AdjacencyMatrix64bit.G6Error("niekompletny napis")
  124.         try:
  125.             c = ord(next(t))
  126.             raise AdjacencyMatrix64bit.G6Error("nadmiarowy znak o kodzie {0}".format(c))
  127.         except StopIteration:
  128.             pass
  129.  
  130.     # Przekształca graf w reprezentację tekstową.
  131.     def __str__(self):
  132.         text, k, c = chr(self.__order + 63), 5, 0
  133.         for v in range(1, self.__order):
  134.             for u in range(v):
  135.                 if (self.__matrix.value & (1 << self.__indexInMatrix__(u, v))) != 0:
  136.                     c |= (1 << k)
  137.                 if k == 0:
  138.                     text += chr(c + 63)
  139.                     k, c = 6, 0
  140.                 k -= 1
  141.         if k != 5:
  142.             text += chr(c + 63)
  143.         return text
  144.  
  145.     # Test równości dwóch reprezentacji grafów.
  146.     def __eq__(self, other):
  147.         if self.__order != other.order():
  148.             return False
  149.         for v in range(1, self.__order):
  150.             for u in range(v):
  151.                 if self.isEdge(u, v) != other.isEdge(u, v):
  152.                     return False
  153.  
  154.         return True
  155.  
  156.     # Test różności dwóch reprezentacji grafów.
  157.     def __ne__(self, other):
  158.         if self.__order != other.order():
  159.             return True
  160.         for v in range(1, self.__order):
  161.             for u in range(v):
  162.                 if self.isEdge(u, v) != other.isEdge(u, v):
  163.                     return True
  164.         return False
  165.  
  166.     def __indexInMatrix__(self, v1, v2):
  167.         if v1 == v2:
  168.             return -1
  169.         v3 = 0
  170.         v4 = 0
  171.         if v2 > v1:
  172.             v3 = v1
  173.             v4 = v2
  174.         else:
  175.             v3 = v2
  176.             v4 = v1
  177.         #v3 to mniejszy, v4 to wiekszy
  178.         index = 0
  179.         step = 9
  180.         for i in range(0, v3):
  181.             index += step
  182.             step -= 1
  183.  
  184.         return index + v4 - 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement