Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.08 KB | None | 0 0
  1. from typing import List, Dict, Any, Optional
  2.  
  3. from algorithm.complex2_from_vector import check_extreme_2d
  4.  
  5.  
  6. def last_not_zero(vector: List[int]) -> Optional[int]:
  7.     for i, degree in enumerate(reversed(vector)):
  8.         if degree:
  9.             return len(vector) - i - 1
  10.     return None
  11.  
  12.  
  13. def get_max(vector: List[int], delta: int, index: int) -> List[int]:
  14.     res = []
  15.     for _ in range(delta):
  16.         m = max(vector[index + 1:])
  17.         i = len(vector) - vector[::-1].index(m) - 1
  18.         res.append(i)
  19.         vector[i] = 0
  20.     return res
  21.  
  22.  
  23. def restore_from_vector(vector: List[int]) -> Dict[str, Any]:
  24.     index = 0
  25.     edges = []
  26.     res: Dict[str, Any] = {'complete': True}
  27.  
  28.     print(vector)
  29.     while vector[index]:
  30.         last = last_not_zero(vector)
  31.         delta = min(vector[index], len(vector[index + 1:last + 1]))
  32.         if delta != len(vector[index + 1:last + 1]):
  33.             res['complete'] = False
  34.  
  35.         for i in get_max(vector.copy(), delta, index):
  36.             vector[i] -= 1
  37.             edges.append((str(index + 1), str(i + 1)))
  38.  
  39.         vector[index] -= delta
  40.  
  41.         print(vector)
  42.  
  43.         if not vector[index]:
  44.             index += 1
  45.  
  46.     if len(edges):
  47.         res['edges'] = edges
  48.  
  49.     matrix = [[0] * len(vector) for _ in range(len(vector))]
  50.     for l, r in edges:
  51.         l = int(l) - 1
  52.         r = int(r) - 1
  53.         matrix[l][r] = 1
  54.         matrix[r][l] = 1
  55.  
  56.     res['extreme'] = check_extreme_2d(matrix)
  57.     if res['extreme']:
  58.         base = []
  59.         for i in range(len(matrix) // 2):
  60.             for j in range(i + 1, len(matrix)):
  61.                 if i == j or not matrix[i][j]:
  62.                     continue
  63.                 if (j == len(matrix) - 1 and not matrix[i + 1][j]) \
  64.                         or (j < len(matrix) - 1 and matrix[i][j] and not matrix[i][j + 1] and not matrix[i + 1][j]):
  65.                     base.append((i + 1, j + 1))
  66.         res['base'] = base
  67.  
  68.     return res
  69.  
  70.  
  71. if __name__ == '__main__':
  72.     # v = [6, 4, 4, 3, 3, 2, 2]
  73.     v = [6, 4, 4, 3, 3, 1, 1]
  74.     print(restore_from_vector(v))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement