Найти все пути, соединяющие две вершины ориентированного графа. - 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;  
}

Объяснение кода листинга программы

Код представляет собой реализацию алгоритма поиска всех путей между двумя вершинами в ориентированном графе.

  1. Входные данные:
    • Граф представлен в виде матрицы A[50][50].
    • Вершины графа пронумерованы от 1 до 5.
    • Исходная вершина a и конечная вершина b вводятся с клавиатуры.
    • Файл one.txt содержит граф в формате, где каждая строка представляет собой набор чисел, соответствующих вершинам графа, разделенных пробелами.
  2. Алгоритм работы:
    • Функция go(int curr, int b) реализует рекурсивный алгоритм поиска путей.
    • Если текущая вершина равна конечной, то выводятся все найденные пути, представленные в виде последовательности чисел, разделенных дефисами.
    • Если текущая вершина не является конечной, то:
      • Помечаем вершину как посещенную.
      • Добавляем текущую вершину в результат.
      • Рекурсивно вызываем функцию go для каждой соседней вершины, которая не была посещена.
    • После завершения работы функции go, все пути будут содержаться в массиве res.
  3. Код:
    • Строка 1: Объявление переменных.
    • Строка 2: Определение функции go.
    • Строка 3: Главная функция программы.
    • Строка 4: Открытие файла one.txt для чтения.
    • Строка 5-14: Чтение данных из файла в матрицу A.
    • Строка 15: Вывод сообщения о необходимости ввода начальной и конечной вершин.
    • Строка 16-17: Ввод начальной и конечной вершин.
    • Строка 18: Вызов функции go для поиска путей.
    • Строка 19: Закрытие файла.
    • Строка 20: Возврат 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы