Advertisement
Solingen

SAKOD_lab5.py

Apr 3rd, 2025
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.95 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # \author: Артюхин Матфей
  3. # \date_start: 2025-03-29
  4. # \date_end: 2025-04-3
  5.  
  6. class Graph:
  7.     """
  8.    \brief Класс для представления графа и работы с матрицами смежности и инцидентности.
  9.  
  10.    \param vertices [in] - список названий вершин
  11.    \param edges [in]    - словарь ребер вида {название: (вершина1, вершина2, вес)}
  12.    """
  13.     def __init__(self):
  14.         self.vertices = []
  15.         self.edges = {}
  16.  
  17.     def add_vertex(self, name):
  18.         """
  19.        \brief Добавление вершины в граф.
  20.  
  21.        \param name [in] - название вершины
  22.        """
  23.         if name in self.vertices:
  24.             print(f"Ошибка: вершина '{name}' уже существует!")
  25.             return
  26.         self.vertices.append(name)
  27.  
  28.     def add_edge(self, name, v1, v2, weight):
  29.         """
  30.        \brief Добавление ребра в граф.
  31.  
  32.        \param name [in]   - название ребра
  33.        \param v1 [in]    - первая вершина
  34.        \param v2 [in]    - вторая вершина
  35.        \param weight [in] - вес ребра
  36.        """
  37.         if name in self.edges:
  38.             print(f"Ошибка: ребро '{name}' уже существует!")
  39.             return
  40.         if v1 not in self.vertices or v2 not in self.vertices:
  41.             print("Ошибка: указанная вершина не существует!")
  42.             return
  43.         self.edges[name] = (v1, v2, weight)
  44.  
  45.     def adjacency_matrix(self):
  46.         """
  47.        \brief Построение матрицы смежности.
  48.  
  49.        \retval list - матрица смежности с весами
  50.        """
  51.         size = len(self.vertices)
  52.         matrix = [[0] * size for _ in range(size)]
  53.         idx = {v: i for i, v in enumerate(self.vertices)}
  54.        
  55.         for edge in self.edges.values():
  56.             i = idx[edge[0]]
  57.             j = idx[edge[1]]
  58.             matrix[i][j] = edge[2]
  59.             matrix[j][i] = edge[2]  # для ненаправленного графа
  60.         return matrix
  61.  
  62.     def incidence_matrix(self):
  63.         """
  64.        \brief Построение матрицы инцидентности.
  65.  
  66.        \retval list - матрица инцидентности с весами
  67.        """
  68.         size_v = len(self.vertices)
  69.         size_e = len(self.edges)
  70.         matrix = [[0] * size_e for _ in range(size_v)]
  71.         idx_v = {v: i for i, v in enumerate(self.vertices)}
  72.         idx_e = {e: i for i, e in enumerate(self.edges)}
  73.        
  74.         for i, (edge_name, edge_data) in enumerate(self.edges.items()):
  75.             v1, v2, weight = edge_data
  76.             matrix[idx_v[v1]][i] = weight
  77.             matrix[idx_v[v2]][i] = weight
  78.         return matrix
  79.  
  80.     def print_matrix(self, matrix, title, row_labels, col_labels):
  81.         """
  82.        \brief Форматированный вывод матрицы.
  83.  
  84.        \param matrix [in]     - матрица для вывода
  85.        \param title [in]      - заголовок
  86.        \param row_labels [in] - метки строк
  87.        \param col_labels [in] - метки столбцов
  88.        \retval None
  89.        """
  90.         print(f"\n{title}:")
  91.         # Шапка с названиями ребер/вершин
  92.         header = "\t" + "\t".join(col_labels)
  93.         print(header)
  94.         # Тело матрицы
  95.         for i, row in enumerate(matrix):
  96.             line = f"{row_labels[i]}\t" + "\t".join(map(str, row))
  97.             print(line)
  98.  
  99. def main():
  100.     """
  101.    \brief Основная функция для ввода данных и вывода результатов.
  102.    """
  103.     graph = Graph()
  104.  
  105.     # Ввод вершин
  106.     n_vertices = int(input("Количество вершин: "))
  107.     for _ in range(n_vertices):
  108.         name = input("Название вершины: ").strip()
  109.         graph.add_vertex(name)
  110.  
  111.     # Ввод ребер
  112.     n_edges = int(input("Количество ребер: "))
  113.     for _ in range(n_edges):
  114.         name = input("Название ребра: ").strip()
  115.         v1 = input("Первая вершина: ").strip()
  116.         v2 = input("Вторая вершина: ").strip()
  117.         weight = float(input("Вес ребра: "))
  118.         graph.add_edge(name, v1, v2, weight)
  119.  
  120.     # Построение и вывод матриц
  121.     adj_matrix = graph.adjacency_matrix()
  122.     inc_matrix = graph.incidence_matrix()
  123.  
  124.     graph.print_matrix(
  125.         adj_matrix,
  126.         "Матрица смежности",
  127.         graph.vertices,
  128.         graph.vertices
  129.     )
  130.  
  131.     graph.print_matrix(
  132.         inc_matrix,
  133.         "Матрица инцидентности",
  134.         graph.vertices,
  135.         list(graph.edges.keys())
  136.     )
  137.  
  138. if __name__ == "__main__":
  139.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement