Загрузка данных


3
1 1 0
1 0 1
0 1 0


"""
Задача 1 (Graf1).
Подсчет степеней вершин неориентированного графа по матрице смежности.
Петли учитываются дважды. Результат выводится в порядке возрастания номеров вершин.
"""

class GraphDegreeCalculator:
    def __init__(self):
        self.n = 0
        self.matrix = []
        self.degrees = []

    def calculate_degrees(self):
        self.degrees = []
        for i in range(self.n):
            degree = sum(self.matrix[i]) + self.matrix[i][i]
            self.degrees.append(degree)

    def start(self):
        filename = input("Введите имя файла с матрицей (например, graf1.txt): ")

        try:
            with open(filename, 'r', encoding='utf-8') as f:
                lines = [line.strip() for line in f.readlines() if line.strip()]

            if not lines:
                raise ValueError("Файл пуст.")

            self.n = int(lines[0])
            self.matrix = []
            
            for i in range(1, self.n + 1):
                row = [int(x) for x in lines[i].split()]
                if len(row) != self.n:
                    raise ValueError(f"Ошибка в строке {i}: ожидалось {self.n} элементов.")
                self.matrix.append(row)

            for i in range(self.n):
                for j in range(self.n):
                    if self.matrix[i][j] != self.matrix[j][i]:
                        raise ValueError("Матрица неориентированного графа должна быть симметричной.")

            self.calculate_degrees()

            for i, deg in enumerate(self.degrees):
                print(f"Вершина {i + 1}: Степень {deg}")

        except FileNotFoundError:
            print("Ошибка: Файл не найден.")
        except Exception as e:
            print(f"Ошибка: {e}")


if __name__ == "__main__":
    app = GraphDegreeCalculator()
    app.start()


4
0 1 1 0
0 0 0 1
0 0 0 1
0 0 0 0

"""
Задача 2 (Graf4).
Обход ориентированного графа в ширину (BFS) от заданной вершины K.
Вывод достижимых вершин в порядке их обхода.
"""

class BFSGraphSolver:
    def __init__(self):
        self.n = 0
        self.matrix = []
        self.visited = []
        self.result_path = []

    def bfs(self, start_vertex):
        self.visited = [False] * self.n
        queue = [start_vertex]
        self.visited[start_vertex] = True
        self.result_path = []

        while queue:
            current = queue.pop(0)
            self.result_path.append(current)

            for neighbor in range(self.n):
                if self.matrix[current][neighbor] > 0 and not self.visited[neighbor]:
                    self.visited[neighbor] = True
                    queue.append(neighbor)

    def start(self):
        filename = input("Введите имя файла с матрицей (например, graf4.txt): ")

        try:
            with open(filename, 'r', encoding='utf-8') as f:
                lines = [line.strip() for line in f.readlines() if line.strip()]

            if not lines:
                raise ValueError("Файл пуст.")

            self.n = int(lines[0])
            self.matrix = []
            
            for i in range(1, self.n + 1):
                row = [int(x) for x in lines[i].split()]
                if len(row) != self.n:
                    raise ValueError(f"Размер строки {i} не совпадает с N.")
                self.matrix.append(row)

            k_input = int(input(f"Введите номер начальной вершины K (от 1 до {self.n}): "))
            if not (1 <= k_input <= self.n):
                raise ValueError("Номер вершины вне допустимого диапазона.")

            self.bfs(k_input - 1)

            formatted_result = [str(v + 1) for v in self.result_path]
            print(" ".join(formatted_result))

        except FileNotFoundError:
            print("Ошибка: Файл не найден.")
        except Exception as e:
            print(f"Ошибка: {e}")


if __name__ == "__main__":
    app = BFSGraphSolver()
    app.start()

4
0 1 1 0
0 0 1 1
0 1 0 1
0 0 0 0


"""
Задача 3 (Graf9).
Поиск всех маршрутов из города K1 в город K2 с ровно P пересадками.
Маршруты сортируются лексикографически и выводятся в текстовый файл.
"""

class RouteFinder:
    def __init__(self):
        self.n = 0
        self.matrix = []
        self.k1 = 0
        self.k2 = 0
        self.target_length = 0
        self.all_routes = []

    def _dfs(self, current_city, current_path, visited_cities):
        if len(current_path) == self.target_length:
            if current_city == self.k2:
                self.all_routes.append(list(current_path))
            return

        for neighbor in range(self.n):
            if self.matrix[current_city][neighbor] == 1 and neighbor not in visited_cities:
                visited_cities.add(neighbor)
                current_path.append(neighbor)
                
                self._dfs(neighbor, current_path, visited_cities)
                
                current_path.pop()
                visited_cities.remove(neighbor)

    def start(self):
        file_in = input("Введите имя входного файла (например, graf9_in.txt): ")
        file_out = input("Введите имя выходного файла (например, graf9_out.txt): ")

        try:
            with open(file_in, 'r', encoding='utf-8') as f:
                lines = [line.strip() for line in f.readlines() if line.strip()]

            if not lines:
                raise ValueError("Файл пуст.")

            self.n = int(lines[0])
            if self.n > 15:
                raise ValueError("По условию задачи N <= 15.")

            self.matrix = []
            for i in range(1, self.n + 1):
                row = [int(x) for x in lines[i].split()]
                if len(row) != self.n:
                    raise ValueError(f"Размер матрицы не совпадает с N в строке {i}.")
                self.matrix.append(row)

            self.k1 = int(input("Введите номер города вылета K1: ")) - 1
            self.k2 = int(input("Введите номер города прилета K2: ")) - 1
            p_transfers = int(input("Введите количество пересадок P: "))

            if not (0 <= self.k1 < self.n) or not (0 <= self.k2 < self.n):
                raise ValueError("Номера городов вне допустимого диапазона.")

            self.target_length = p_transfers + 2
            self.all_routes = []

            visited = set([self.k1])
            self._dfs(self.k1, [self.k1], visited)
            
            self.all_routes.sort()

            with open(file_out, 'w', encoding='utf-8') as fout:
                if not self.all_routes:
                    fout.write("-1\n")
                    print(f"Маршрутов не найдено. В файл {file_out} записано -1.")
                else:
                    fout.write(f"{len(self.all_routes)}\n")
                    for route in self.all_routes:
                        formatted_route = [str(city + 1) for city in route]
                        fout.write(" ".join(formatted_route) + "\n")
                    print(f"Найдено маршрутов: {len(self.all_routes)}. Результат сохранен.")

        except FileNotFoundError:
            print("Ошибка: Входной файл не найден.")
        except Exception as e:
            print(f"Ошибка: {e}")


if __name__ == "__main__":
    app = RouteFinder()
    app.start()