На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Генерация графа. Алгоритм Прима , Необходимо сгенерировать граф с помощью алгоритма Прима
    Здравствуйте, помогите пожалуйста составить генерацию графа и алгоритм Прима в одном коде.
    Вот мои наработки:
    ExpandedWrap disabled
      #include <iostream>
      #include <conio.h>
      #include <iomanip>
      #include <stdlib.h>
       
      int a, b, u, v, n, x, y;
      int ne = 1;
      int visited[10] = {0};
      int min;
      int mincost = 0;
       
      void gen_random_graph(int n)
      {
          srand(time(0));
          int adj_matrix[n][n];
       
          for(int u = 0; u < n; u++)
          {
              for (int v = u; v < n; v++)
              { //Вам не нужно рассчитывать вес дважды, поэтому цикл начинается с u
                  if(adj_matrix[u][v] == adj_matrix[v][u])
                  {
                      adj_matrix[u][v] = rand() % 10 + 1;
                      std::cout << adj_matrix[u][v] << std::endl;
                  }
              }
          }
      }
       
      int main()
      {
          int N;
          int adj_matrix[n][n];
          std::cout << "Enter the number of vertices: ";
          std::cin >> N;
          gen_random_graph(N);
       
          int path[100] = {0}; //В этот массив будут записываться вершины, по которым составиться путь
          int path_index = 0;
       
          std::cout << "\nMatrix" << std::endl; //Введи матрицу
       
          for(int u = 0; u < N; u++)
          {
              for(int v = 0; v < N; v++)
              {
                  std::cout << adj_matrix[u][v] << std::setw(5);
              }
              std::cout << "\n";
          }
       
          while(ne < N)
          {
              for(u = 1, min = 999; u <= N; u++)
              for(v = 1; v <= N; v++)
              if(adj_matrix[u][v] < min)
              if(visited[u] != 0)
              {
                  min = adj_matrix[u][v];
                  a = x = u;
                  b = y = v;
              }
              if(visited[x] == 0 || visited[y] == 0)
              {
                  path[path_index] = b;
                  path_index++;
                  //cout<<"\n "<<ne++<<"  "<<a<<"  "<<b<<min; //Можно вывести так
                  ne++; //если строчку выше раскомментировать - эту закомментировать
                  mincost += min;
                  visited[b] = 1;
       
              }
              adj_matrix[a][b] = adj_matrix[b][a] = 999;
          }
              
          std::cout << "Minimum spanning tree\n"; //Минимальное остовное дерево
          std::cout << 1 << " --> ";
          for(int u = 0; u < N-1; u++)
          {
              std::cout << path[u];
              if(u < N-2)
              {
                  std::cout<<" --> ";
              }
          }
          std::cout << "\nMinimum cost " << mincost; //Минимальная стоимость
          std::cin.get();
       
          return 0;
      }

    Прикреплённая картинка
    Прикреплённая картинка

    Прикреплённая картинка
    Прикреплённая картинка
      1. в функции gen_random_graph точно локальная переменная должна быть adj_matrix
      2.
      Цитата zig_zag @
      for(int u = 0; u < n; u++)
      {
      for (int v = u; v < n; v++)
      { //Вам не нужно рассчитывать вес дважды, поэтому цикл начинается с u
      if(adj_matrix[u][v] == adj_matrix[v][u])
      {
      adj_matrix[u][v] = rand() % 10 + 1;
      std::cout << adj_matrix[u][v] << std::endl;
      }
      }
      }

      все здесь смотрится странно)

      вообще логика, ИМХО, в прожке какая-то странная...

      1. объявил матрицу смежности (хотя у тебя ВЕСОВАЯ!) (лучше динамику сделай, т к кол-во вершин появляется в процесссссе работы программы)
      2. в функции заполнил матрицу смежности (ВЕСОВ!), указывая тройки чисел: номера вершин и вес ребра между ними
      3. в отдельной функции вывел на экран весовую матрицу

      короче, стремись к тому, чтобы 1 функция - 1 дело, можешь хоть 20 функций создать, это в разы перспективнее, чем лепить все подряд...
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0439 ]   [ 18 queries used ]   [ Generated: 25.04.24, 07:36 GMT ]