Найти все пути, соединяющие две вершины ориентированного графа. - C (СИ)
Формулировка задачи:
Помогите дописать программу.
#include<stdio.h> #include<conio.h> int visited[5]; int A[50][50]; void go(int curr) { visited[curr] = 1; /* помечаем текущую вершину как пройденную */ for (int i=0;i<5;i++) if (!visited[i] && A[curr][i]) go(i); } int main(){ FILE *file; int i=0,j=0,a,b; if((file=fopen("one.txt","r"))== NULL) { printf("\n ERROR!!\n"); return 1; } for(i=0;i<5;i++) for(j=0;j<5;j++) fscanf(file,"%d",&A[i][j]); printf("VVedite dve vershini:\n"); scanf("%d",&a); scanf("%d",&b); go(a-1); if (visited[b-1]) { ........... getch(); fclose(file); return 0; }
one.txt
0 0 1 1 0
0 0 1 0 0
0 0 0 1 1
0 0 0 0 1
0 0 0 1 0
a=1,b=5
Вывод:
1-3-4-5
1-3-5
1-4-5
Решение задачи: «Найти все пути, соединяющие две вершины ориентированного графа.»
textual
Листинг программы
#include<stdio.h> #include<conio.h> int visited[5], res[5], N_res; int A[50][50]; void go(int curr, int b) { int i; if(curr==b) { for(i=0; i<N_res; i++) printf("%d-", res[i]+1); printf("%d\n", b+1); return; } visited[curr]=1; res[N_res++]=curr; for(i=0; i<5; i++) if(A[curr][i] && !visited[i]) { go(i, b); } visited[curr]=0; N_res--; } int main(){ FILE *file; int i=0,j=0,a,b; if((file=fopen("one.txt","r"))== NULL) { printf("\n ERROR!!\n"); return 1; } for(i=0;i<5;i++) for(j=0;j<5;j++) fscanf(file,"%d",&A[i][j]); printf("VVedite dve vershini:\n"); scanf("%d",&a); scanf("%d",&b); go(a-1, b-1); getch(); fclose(file); return 0; }
Объяснение кода листинга программы
Код представляет собой реализацию алгоритма поиска всех путей между двумя вершинами в ориентированном графе.
- Входные данные:
- Граф представлен в виде матрицы A[50][50].
- Вершины графа пронумерованы от 1 до 5.
- Исходная вершина a и конечная вершина b вводятся с клавиатуры.
- Файл
one.txt
содержит граф в формате, где каждая строка представляет собой набор чисел, соответствующих вершинам графа, разделенных пробелами.
- Алгоритм работы:
- Функция go(int curr, int b) реализует рекурсивный алгоритм поиска путей.
- Если текущая вершина равна конечной, то выводятся все найденные пути, представленные в виде последовательности чисел, разделенных дефисами.
- Если текущая вершина не является конечной, то:
- Помечаем вершину как посещенную.
- Добавляем текущую вершину в результат.
- Рекурсивно вызываем функцию go для каждой соседней вершины, которая не была посещена.
- После завершения работы функции go, все пути будут содержаться в массиве res.
- Код:
- Строка 1: Объявление переменных.
- Строка 2: Определение функции go.
- Строка 3: Главная функция программы.
- Строка 4: Открытие файла
one.txt
для чтения. - Строка 5-14: Чтение данных из файла в матрицу A.
- Строка 15: Вывод сообщения о необходимости ввода начальной и конечной вершин.
- Строка 16-17: Ввод начальной и конечной вершин.
- Строка 18: Вызов функции go для поиска путей.
- Строка 19: Закрытие файла.
- Строка 20: Возврат 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д