AhmedYousry20 Ответов: 2

Как я могу проверить, не содержит ли матрица смежности цикла или цикла?


Я попросил пользователя ввести матрицу смежности и попытался проверить ее следующим кодом, но иногда она выдает мне "Граф-это не дерево", каким бы ни был ввод, а иногда превращается в бесконечный цикл и показывает "введите количество узлов" навсегда

Что я уже пробовал:

#include <iostream>
#include <stdlib.h>
using namespace std;
int v;
bool isCycle(int u, bool visited[], int parent) {
    int **A;
    cout<< "Enter number of nodes \n";
   cin>>v;

   A=(int**)malloc(v*sizeof(int*));
   if(A==NULL)
   {
       cout<<"Out of memory";
       return 1;
   }

   for(int i=0;i<v;i++)
   {
       A[i]=(int*)malloc(v*sizeof(int));
    if(A[i]==NULL)
    {
       cout<<"Out of memory";
       return 1;
    }
   }
   cout<<"NOTE that your Adjacency Matrix contains ZEROs and ONEs ONLY \n";

   cout<<"Enter your Adjacency Matrix \n";

   for(int i=0;i<v;i++)     //Fill Matrix
   {
        for(int j=0;j<v;j++)
        {
        cin>>A[i][j];
        }
   }

   visited[u] = true;    //mark v as visited
   for(int b = 0; b<v; b++) {
      if(A[u][b]) {
         if(!visited[b]) {     //when the adjacent node v is not visited
            if(isCycle(b, visited, u)) {
               return true;
            }
         } else if(b != parent) {    //when adjacent vertex is visited but not parent
            return true;    //there is a cycle
         }
      }
   }
   return false;
}
bool isTree() {
   bool *vis = new bool[v];

   for(int i = 0; i<v; i++)
      vis[i] = false;    //initialize as no node is visited

   if(isCycle(0, vis, -1))    //check if there is a cycle or not
      return false;

   for(int i = 0; i<v; i++) {
      if(!vis[i])    //if there is a node, not visited by traversal, graph is not connected
         return false;
   }
   return true;
}

int main() {
   if(isTree())
      cout << "The Graph is a Tree.";
   else
      cout << "The Graph is not a Tree.";
}

2 Ответов

Рейтинг:
1

KarstenK

Это ясная задача для всех нас. ты для отладки кода. Для обучения кодированию и использованию отладчика вы можете посетить сайт Изучайте C++ и найдите главы отладчика.

Ваша функция isCycle выглядит так, как будто вы пропустили какой-то реальный код. Верните true и false и нет 1 или 0.

Честно говоря: ваш код не выглядит как решение, но некоторые скопированные и вставленные куски без смысла.

Совет: напишите несколько тестов с известными данными, чтобы вы могли легко проверить работу кода.


Рейтинг:
1

Rick York

Одна вещь, которую я заметил - проверьте ваше использование переменной v. Во-первых, вызывается isTree (), и первое, что он делает, - это bool *vis = new bool[v]; каково значение v в это время? Вы можете предположить ноль, но я не люблю полагаться на ценность неинициализированных данных. Я предпочитаю всегда ставить его на что-то.

Если бы я был на вашем месте, я бы изменил эту логику, чтобы прочитать матрицу из файла. Первая строка может содержать размер матрицы, а затем данные могут следовать. Это сделает ваши циклы тестирования намного быстрее, так как вам не придется вводить данные каждый раз. Имя файла можно указать в качестве аргумента командной строки.


KarstenK

Я предполагаю, что это скопированный код и вставленный от кого-то, кто его не понял: - O