Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 08.05.2018
Сообщений: 3
1

Алгоритм Крускала

15.05.2018, 21:22. Показов 2781. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста! никак не могу разобраться,при компиляции выдает ошибку: Необработанное исключение по адресу 0x00007FF6661A1332 в ConsoleApplication7.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
using namespace std;
struct vertex        // структура
{
    int number;     // целочисленная переменная
    int color;
    bool preference;    // логическая переменная
};
struct edge    // структура пути
{
    int beg_v;               //начальная вершина
    int end_v;              //конечная вершина
    int weight;             //вес ребра
    bool presence;      // логическая переменная типа флага наверное
};
class Task          //создаем класс задача
{
public:             // переменные класса
    int n, m;          // количество вершин и ребер
    int **matrix;      //  указатель на двухмерный массив
    vector <edge> solution;
    multimap <int, edge> full_list;
public: void Read_of_file(string s)           //функции класса задача
{
    ifstream f;    //доступ к файловому документу
    f.open(s);     // открытие файла для чтения данных
    if (f.fail())     // проверка на сущ файла
        cout << "Ошибка открытия файла";
    f >> n;         // чтения количества вершин
    matrix = new int *[n];        // динамический массив (матрица)
    for (int i = 0; i < n; i++)
        matrix[i] = new int[n];         // цикл для создания динамического двухмерного массива через указатель
    for (int i = 0; i < n; i++)        // циклы для обнуления матрицы
        for (int j = 0; j < n; j++)
            matrix[i][j] = 0;
    f >> m;                    // чтение количества ребер
    int j, k, w;
    for (int i = 0; i < m; i++)       // цикл для заполнения матрицы весов
    {
        f >> j;                  // чтения из файла начальной конечной вершины и веса ребра
        f >> k;
        f >> w;
        matrix[j - 1][k - 1] = w;      //заполнение матрицы весов
        matrix[k - 1][j - 1] = w;
        edge a;           // создаем объект структуры    edge, или переменную структуры edge
        a.beg_v = j;       //вызываем или обращаемся к переменным объекта которого создали
        a.end_v = k;          // при этом присваиваем соответствующие значения
        a.weight = w;
        a.presence = false;
        full_list.insert({ w, a });
    }
    cout << "Матрица смежности" << endl;
    for (int i = 0; i < n; i++)             // цикл для печати матрицы смежности
    {
        for (int j = 0; j < n; j++)
            cout << matrix[i][j] << " ";        //вывод в консоль значения
        cout << endl;
    }
    cout << endl;
}
        void Write(string s)           // функция запись решения в файл
        {
            ofstream f;
            f.open(s);
            f << endl << endl << "Решение" << endl;
            for (int i = 0; i < solution.size(); i++)       // цикл запись в файл  значений нижней строки
            {
                f << "ребро " << solution[i].beg_v << " " << solution[i].end_v << ", вес - " << solution[i].weight << endl;
            }
        }
};
class Algorithm         // создаем класс алгоритм
{
    Task task;        // в классе алгоритм создаем переменную или объект класс задача
public: void Realise()        //функция реализации алгоритма
{
    task.Read_of_file("input.txt");    // указываем путь к файлу для чтения
    cout << "Ребра после сортировки" << endl;          // выводится просто запись в кавычках
    int j = 0;
    for (auto i = task.full_list.begin(); i != task.full_list.end(); ++i, j++)
    {          //цикл работающий пока конец файла выводит в консоль нижние строки
        cout << "Ребро " << j + 1 << ": " << endl;
        cout << i->second.beg_v << " " << i->second.end_v << endl;
        cout << "вес - " << i->first << endl << endl;
    }
    Cruscal();
    task.Write("output.txt");         //вызов функции записи в файл
    cout << endl << endl << "Решение" << endl;
    for (int i = 0; i < task.solution.size(); i++)    // цикл вывода значение (нижней строки) в консоль
    {
        cout << "ребро " << task.solution[i].beg_v << " " << task.solution[i].end_v << ", вес - " << task.solution[i].weight << endl;
    }
}
        void Cruscal()         //  функция необходимая для реализации задачи курсовой
        {
            vertex *vertexes = new vertex[task.n];
            for (int i = 0; i < task.n; i++)
            {
                vertexes[i].number = i;
                vertexes[i].color = i;
                vertexes[i].preference = false;
            }
 
            Insert_edge(vertexes);
        }
        void Insert_edge(vertex *vertexes)      //  функция необходимая для реализации, задача курсовой
        {
            int count = 0;
            int y = 0;
            for (auto i = task.full_list.begin(); i != task.full_list.end(); ++i, y++)
            {
                if (i->second.presence == false && y != task.n - 2 && count != task.n - 1)         // проверка условий
                    if (vertexes[i->second.beg_v - 1].color != vertexes[i->second.end_v - 1].color)
                    {
                        i->second.presence = true;
                        vertexes[i->second.end_v - 1].color = vertexes[i->second.beg_v - 1].color;
                        vertexes[i->second.end_v - 1].preference = true;
                        vertexes[i->second.end_v - 1].preference = true;
                        if (vertexes[i->second.end_v - 1].preference == true)
                        {
                            for (auto j = task.full_list.begin(); j != task.full_list.end(); ++j)
                            {
                                if (j->second.beg_v == i->second.end_v && j->second.presence == true)
                                    vertexes[j->second.end_v - 1].color = vertexes[j->second.beg_v - 1].color;
                            }
                        }
                        edge a;      // создаем объект edge
                        a.beg_v = i->second.beg_v;     // запись в переменные этого объекта, используется еще в списках 
                        a.end_v = i->second.end_v;
                        a.weight = i->second.weight;
                        a.presence = i->second.presence;
                        task.solution.push_back(a);
                        count++;  // увеличения счетчика
                    }
            }
        }
};
int _tmain(int argc, _TCHAR* argv[])     //  основная часть программы
{
    setlocale(LC_ALL, "Rus");        // подключение русской библиотеки
    Algorithm a;        //создаем объект класса алгоритм
    a.Realise();          // обращаемся к функции реализации алгоритма класса алгоритм
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2018, 21:22
Ответы с готовыми решениями:

Алгоритм Крускала
Задача:Порядок ввода:Порядок вывода:Пример ввода:Пример вывода:Органичения:я решил ее с помощью...

Алгоритм Крускала
Помогите найти ошибку в алгоритме.Он и работает как то не так и при выводе результатов еще и ошибку...

Алгоритм, обратный алгоритму Крускала
Требуется реализовать алгоритм поиска максимального остовного дерева

Алгоритм крускала, реализованный в кодеблоке, не запускается в студии
задача: алгоритм крускала #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include...

2
Эксперт С++
3072 / 1410 / 425
Регистрация: 19.01.2009
Сообщений: 3,889
15.05.2018, 21:54 2
youpain, покажите ваш input.txt
0
0 / 0 / 0
Регистрация: 08.05.2018
Сообщений: 3
15.05.2018, 22:47  [ТС] 3
schdub,
5
10
1 2 6
1 3 8
1 4 14
1 5 13
2 3 7
2 4 12
2 5 14
3 4 9
3 5 11
4 5 15
С данной проблемой вроде разобрался уже пока сидел,но теперь другая проблема, при выводе решения почему то пропускает ребро 3 4 с весом 9, а вместо него добавляет ребро 2 4 с весом 12
Решение
ребро 1 2, вес - 6
ребро 2 3, вес - 7
ребро 3 5, вес - 11
ребро 2 4, вес - 12
0
15.05.2018, 22:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2018, 22:47
Помогаю со студенческими работами здесь

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void lab...

Волновой алгоритм поиска (Алгоритм A* / Алгоритм А стар)
Хочу разработать алгоритм для решения головоломки с подвижными дисками (перестановочная...

Алгоритм Крускала и Прима
Здраствуйте, алгоритм Крускала и Прима можна ли использовать для отрицательных значений ребер...

Алгоритм Прима, Крускала
Нашел код реализации алгоритмов, пробовал сделать форму но выдает кучу ошибок. program Project1; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru