-
Notifications
You must be signed in to change notification settings - Fork 157
Expand file tree
/
Copy pathsample_dijkstra.cpp
More file actions
134 lines (116 loc) · 2.69 KB
/
Copy pathsample_dijkstra.cpp
File metadata and controls
134 lines (116 loc) · 2.69 KB
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
#include "dijkstra.h"
#include <cfloat>
#include <iostream>
using namespace std;
int main() {
Graph* graph;
int n; // Êîëè÷åñòâî âåðøèí
int m; // Êîëè÷åñòâî ðåáåð
int s; // Ñòàðòîâàÿ âåðøèíà
int typeGenerate;
try
{
cout << "Write number vertices" << endl;
cin >> n;
cout << "Write number edges" << endl;
cin >> m;
graph = new Graph(n, m);
}
catch (...)
{
return -1;
}
cout << "Write type generate graph:" << endl;
cout << "1. Random" << endl;
cout << "2. Manual" << endl;
cin >> typeGenerate;
switch (typeGenerate)
{
/* Ðàíäîìíàÿ ãåíåðàöèÿ ãðàôà*/
case 1: {
try
{
int minRange; // Ìèíèìàëüíîå çíà÷åíèå âåñà ðåáðà
int maxRange; // Ìàêñèìàëüíîå çíà÷åíèå âåñà ðåáðà
cout << "Write minRange" << endl;
cin >> minRange;
cout << "Write maxRange" << endl;
cin >> maxRange;
graph->generateGraph(minRange, maxRange);
}
catch (...) {
return -1;
}
break;
}
/* Ðó÷íàÿ ãåíåðàöèÿ ãðàôà*/
case 2: {
int _nac_ver, _kon_ver;
float _weight;
try
{
for (int i = 0; i < m; i++) {
cout << "Write start vershinu" << endl;
cin >> _nac_ver;
cout << "Write finish vershinu" << endl;
cin >> _kon_ver;
cout << "Write weight" << endl;
cin >> _weight;
graph->addEdge(_nac_ver, _kon_ver, _weight);
}
}
catch (...)
{
return -1;
}
break;
}
}
if (!graph->isConnectivity()) // Ïðîâåðêà íà ñâÿçíîñòü
return -3;
graph->printVertices();
cout << "Write start vertices for Dijkstra" << endl;
cin >> s;
graph->printList();
cout << endl;
float *dist; // Ìàññèâ ðàññòîÿíèé ìåæäó S è i-òîé âåðøèíîé
int *up; // Ìàññèâ âåðøèí, ïðåäøåñòâóþùèõ â êðàò÷àéøåì ïóòè
try {
Dijkstra::dijkstra(graph, s, dist, up);
}
catch (...) {
return -2;
}
cout << n << ' ' << m << endl; // Ïå÷àòü êîëè÷åñòâî âåðøèí
cout << s << endl; // Ïå÷àòü ñòàðòîâîé âåðøèíû
m = graph->getRealSize();
WeightedEdge* edge;
cout << "// Matrix edges //" << endl; // Ïå÷àòü ìàòðèöû âçâåøåííûé âåðøèí
for (int j = 0; j < m; j++) {
edge = graph->getEdge(j);
cout << edge->nac_ver << ' ' << edge->kon_ver << ' ' << edge->weight << endl;
}
cout << endl << "// Distances //" << endl; // Ïå÷àòü ðàññòîÿíèé îò çàäàííîé âåðøèíû S äî i-òîé âåðøèíû
for (int i = 0; i < n; i++) {
if (dist[i] == FLT_MAX) return -4;
cout << s << " -> " << i << " distance = " << dist[i] << endl;
}
cout << endl << "// Ways //" << endl; // Ïå÷àòü ïóòåé âñåõ âåðøèí
for (int i = 0; i < n; i++) {
int j = i;
cout << j << " <- ";
while (up[j] != s) {
cout << up[j] << " <- ";
j = up[j];
}
cout << s << endl;
}
// Îñâîáîæäåíèå ïàìÿòè
delete graph;
delete[]dist;
delete[]up;
// Çàäåðæêà êîíñîëè
cout << endl;
system("pause");
return 0;
}