Найти все пути, соединяющие две вершины ориентированного графа. - 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, чтобы указать, что программа успешно завершилась.