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

Алгоритм Джонсона для графов

27.11.2014, 21:26. Показов 1809. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти самые короткие пути между всеми парами взвешенного ориентированного графа, используя алгоритм Джонсона.
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "windows.h"
#include <string>
#include "Johnson.h"
using namespace std;
int main(int argc, char **argv){
 LARGE_INTEGER freq;
 LARGE_INTEGER sQP, fQP;
 QueryPerformanceFrequency(&freq);
 if (argc < 2){
 printf("\nUsage: program.exe <graph file> [-o]\n");
 return 1;
 }
 GraphMatrix *gr;
 int *up;
 int *dist;
 bool printOutput = false;
 ParseGraph(argv[1], &gr);
 if (argc == 3)
 if(string(argv[2]) == string("-o"))
 printOutput = true;
// pi - функция
 up = new int[gr->sizeV * gr->sizeV];
 // дистанция до вершины
 dist = new int[gr->sizeV * gr->sizeV];
 QueryPerformanceCounter(&sQP);
 Johnson(gr, up, dist);
 QueryPerformanceCounter(&fQP);
 printf("Johnson time: %f\n",
 (fQP.QuadPart-sQP.QuadPart)/ (double)freq.QuadPart );
 if(printOutput)
 {
 FILE *distFile=fopen("08_dist.dat", "wb");
 fwrite(dist, sizeof(int), gr->sizeV * gr->sizeV,
 distFile);
 fclose(distFile);
 printf("File (08_dist.dat) written.\n" );
 }
 delete[] gr->column;
 delete[] gr->pointerB;
 delete[] gr->value;
 delete gr;
 delete [] up;
 delete [] dist;
 return 0;
}
#ifndef DIJKSTRA_H
#define DIJKSTRA_H
#include "routine.h"
#include <cstdio>
#include <queue>
#include <algorithm>
//API
// void Dijkstra(graphMatrix *gr, int givenNode, int *up,
// int *dist);
// Алгоритм Дейкстры поиска кратчайших путей из источника
// во все вершины
//
//INPUT
// graphMatrix - взвешенный граф
// int - вершина источник
//
//OUTPUT
// int * - pi-функция
// int * - растояние до вершин
void Dijkstra(GraphMatrix *gr, int givenNode, int *up,
 int *dist);
#endif
struct Pair
{
 int dist;
 int node;
};
bool operator<(Pair p1, Pair p2)
{
 // более приоритетны меньшие элементы!
 return (p1.dist > p2.dist);
}
void Dijkstra(GraphMatrix *gr, int givenNode, int *up,
 int *dist)
{
 //все вершины бесконечно удалены
 for (int i=0; i < gr->sizeV; i++)
 dist[i] = INT_MAX;
 dist[givenNode] = 0;
 up[givenNode] = givenNode;
 priority_queue<Pair> pq;
 //помещаем стартовую вершину в приоритетную очередь
 Pair t = {0,givenNode};
 pq.push(t);
//поиск кратчайших путей
 while(!pq.empty())
 {
 // изымаем элемент из очереди
 Pair s = pq.top();
 pq.pop();
 // для изъятой вершины проверяем окрестность
 // на предмет уменьшения длин пути
 int okr_s = gr->pointerB[s.node];
 int okr_f = gr->pointerB[s.node + 1];
 for(int okr_i = okr_s; okr_i < okr_f; okr_i++)
 {
 int j = gr->column[okr_i];
 //релаксация
 if (dist[j] > (dist[s.node] + gr->value[okr_i]))
 {
 dist[j] = (dist[s.node] + gr->value[okr_i]);
 up[j] = s.node;
 //помещаем вершину в очередь, т.к. она может
 // уменьшить путь
 Pair p = {dist[j],j};
 pq.push(p);
 }
 }
  }
}
#ifndef JOHNSON_H
#define JOHNSON_H
#include "Dijkstra.h"
//API
// bool BellmanFord(graphMatrix *gr, int givenNode,
// int *dist);
// Алгоритм поиска кратчайшего пути во взвешенном графе из
// источника во все вершины
//
//INPUT
// graphMatrix - взвешенный граф
// int - вершина источник
//
//OUTPUT
// int * - растояние до вершин
bool BellmanFord(GraphMatrix *gr, int givenNode,
 int *dist);
//API
// void Johnson(graphMatrix *gr, int *up, int *dist);
// Алгоритм Джонсона поиска кратчайших путей между каждой
// парой вершин
//
//INPUT
// graphMatrix - взвешенный граф
//
//OUTPUT
// int * - pi-функция
// int * - растояние до вершин
void Johnson(GraphMatrix *gr, int *up, int *dist);
#endif
bool BellmanFord(GraphMatrix *gr, int givenNode,
 int *dist){
 // переменные прохода по окрестности вершины графа
  int okr_s, okr_f, okr_i;
 int i, j, k;
 // пока все вершины бесконечно удалены
 for (i=0; i < gr->sizeV; i++)
 dist[i] = INT_MAX;
 // растояние до начальной вершины равно 0
 dist[givenNode] = 0;
//поиск циклов и расстояний до вершин
 for (k=0; k < gr->sizeV - 1; k++)
 {
 for (i=0; i < gr->sizeV; i++)
 {
 //для изъятой вершины проверяем окрестность
 // на предмет уменьшения длин пути
 okr_s = gr->pointerB[i ];
 okr_f = gr->pointerB[i + 1];
 for(okr_i = okr_s; okr_i < okr_f; okr_i++)
 {
 j = gr->column[okr_i];
 //релаксация
 if (dist[j] - gr->value[okr_i] > dist[i])
 {
 dist[j] = dist[i] + gr->value[okr_i];
 }
 }
 }
 } 
 for (i = 0; i < gr->sizeV; i++)
 {
 okr_s = gr->pointerB[i ];
 okr_f = gr->pointerB[i + 1];
 for(okr_i = okr_s; okr_i < okr_f; okr_i++)
 {
 j = gr->column[okr_i];
 if (dist[j] > (dist[i] + gr->value[okr_i]))
 return false;
 }
 }
 return true;
}
void Johnson(GraphMatrix *gr, int *up, int *dist)
{
 int i, j, n;
 int okr_s, okr_f, okr_i;
 int *h;
 GraphMatrix gr_h;
 n = gr->sizeV;
 gr_h.sizeV = n + 1;
 gr_h.sizeE = gr->sizeE + n;
 gr_h.column = new int [gr->sizeE + n];
 gr_h.value = new int [gr->sizeE + n];
 gr_h.pointerB = new int [n + 2];
 h = new int [n + 1];
 for(i = 0; i < gr->sizeE; i++)
 {
 gr_h.column[i + n] = gr->column[i] + 1;
 gr_h.value [i + n] = gr->value [i];
 }
 gr_h.pointerB[0] = 0;
 for(i = 0; i < n; i++)
 {
 gr_h.pointerB[i + 1] = gr->pointerB[i] + n;
 gr_h.column[i] = i;
 gr_h.value [i] = 0;
 }
 gr_h.pointerB[i + 1] = gr->pointerB[i] + n;
 bool f = false;
 f = BellmanFord(&gr_h, 0, h);
 if (!f)
 {
    printf("exist negativ circle\n");
 return;
 }
  delete [] gr_h.column;
 delete [] gr_h.value;
 delete [] gr_h.pointerB;
for (i = 0; i < n; i++)
 {
 okr_s = gr->pointerB[i ];
 okr_f = gr->pointerB[i + 1];
 for(okr_i = okr_s; okr_i < okr_f; okr_i++)
 {
 j = gr->column[okr_i];
 gr->value[okr_i] += h[i + 1] - h[j + 1];
 }
 }
 for(i = 0; i < n; i++)
 Dijkstra(gr, i, up + n * i, dist + n * i);
 for (i = 0; i < n; i++)
 {
 okr_s = gr->pointerB[i ];
 okr_f = gr->pointerB[i + 1];
 for(okr_i = okr_s; okr_i < okr_f; okr_i++)
 {
 j = gr->column[okr_i];
 gr->value[okr_i] -= h[i + 1] - h[j + 1];
 }
 }
 for(i = 0; i < n; i++)
 for(j = 0; j < n; j++)
 dist[n * i + j] += h[j + 1] - h[i + 1];
 delete []h;
}
Этот код не работает, там есть алгоритмы Дейкстры и Беллмана-Форда, но я не могу их нормально собрать в рабочий код. Можно пояснить как эти 2 алгоритма преобразовать в алгоритм Джонсона?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2014, 21:26
Ответы с готовыми решениями:

Алгоритм Джонсона для графов
Подскажите, пожалуйста, где можно найти реализацию этого алгоритма или помогите с реализацией. Я так понял, что сначала там идёт алгоритм...

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

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2014, 21:26
Помогаю со студенческими работами здесь

Алгоритм Флойда (теория графов)
код: int** floid(int** W,int n){ vector&lt;int**&gt;D(n); int** A=new int*; for(int i=0;i&lt;n;i++){ A=new int; for(int...

Теорие графов. Композиция двух неор. графов.
Здравствуйте. Прошу помощи уже здесь :| (old topic)... Прошу помочь с составлением алгоритма &quot;Композиции двух неориентированных...

Алгоритм Джонсона для 3 станков
Здравствуйте, у нас в списке вопросов для защиты лабораторной по алгоритму Джонсона есть вопрос, где нужно объяснить, как из формулы (1)...

Алгоритм Джонсона-Троттера
Здравствуйте, помогите пожалуйста доказать, что сложность алгоритма ДЖ-ТР это O(n!) Саму работу алгоритма я понимаю, а вот с приведением...

Задача Джонсона для 2х станков
Помогите решить проблему Код: private void timer_Tick(object sender, EventArgs e) { bool ina = false; ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru