Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2021, 15:50   #1
buk_bear
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 10
По умолчанию Генерация графа. Алгоритм Прима

Здравствуйте, помогите пожалуйста составить генерацию графа и алгоритм Прима в одном коде.
Вот мои наработки:
Код:
#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;
int adj_matrix[10][10];
 
void gen_random_graph(int n)
{
    int adj_matrix[n][n];
    for(int u = 0; u < n; u++)
    {
        for (int v = 0; v < n; v++)
        {
            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;
    std::cout << "Enter the number of vertices: ";
    std::cin >> N;
    gen_random_graph(N+1);
 
    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;
}
Изображения
Тип файла: png Screenshot_31.png (2.8 Кб, 13 просмотров)
Тип файла: png Screenshot_32.png (2.0 Кб, 13 просмотров)
buk_bear вне форума Ответить с цитированием
Старый 20.12.2021, 12:39   #2
buk_bear
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 10
По умолчанию

Я слегка доработал код:
Код:
#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;
}
Но всё равно есть проблемы, они описанные на скриншотах
Изображения
Тип файла: png Screenshot_1.png (6.0 Кб, 11 просмотров)
Тип файла: png Screenshot_2.png (2.1 Кб, 11 просмотров)
buk_bear вне форума Ответить с цитированием
Старый 20.12.2021, 17:37   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,312
По умолчанию

У вас часть кода:
Код:
...
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)
...
Тут со скобками всё в порядке??
Это в отношении к циклам for ...
Язык не знаю ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 20.12.2021, 21:41   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Целиком код не смотрел. adj_matrix в main и в gen_random_graph это два совершенно разных локальных массива. Поэтому заполнение массива в функции gen_random_graph никак не повлияет на массив в main. Или заведите глобальный массив избыточного размера или динамически выделяйте память под массив и передавайте его в gen_random_graph для заполнения или используйте структуры, доступные в C++ (например, вектор). Если говорить о заполнении матрицы смежности, то делал бы так:
Код:
for (int u = 0; u < n; u++)
{
    adj_matrix[u][u] = 0;
    for (int v = u + 1; v < n; v++)
    {
        adj_matrix[u][v] = adj_matrix[v][u] = rand() % 10;
    }
}
А печатать матрицу отдельными циклами, так как эти циклы проходят только половину матрицы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Прима/Крускала классы/модули Katherine09 Компоненты Delphi 1 06.06.2016 11:22
Алгоритм Прима (C++) ZoxWatt Помощь студентам 0 06.10.2012 10:33
Обход графа: в глубину, ширину. Алгоритм Прима Fantom.as Общие вопросы C/C++ 0 18.05.2012 17:09
Алгоритм Прима tema65 Помощь студентам 0 12.01.2012 18:37
Алгоритм Прима DeCo Помощь студентам 0 10.09.2010 15:11