diff --git a/Basov_AS/lab_dijkstra/doc/otchet_dheap.docx b/Basov_AS/lab_dijkstra/doc/otchet_dheap.docx new file mode 100644 index 000000000..d0e42f079 Binary files /dev/null and b/Basov_AS/lab_dijkstra/doc/otchet_dheap.docx differ diff --git a/Basov_AS/lab_dijkstra/doc/otchet_dheap.pages b/Basov_AS/lab_dijkstra/doc/otchet_dheap.pages new file mode 100644 index 000000000..5b88154c8 Binary files /dev/null and b/Basov_AS/lab_dijkstra/doc/otchet_dheap.pages differ diff --git a/Basov_AS/lab_dijkstra/include/d-heap.h b/Basov_AS/lab_dijkstra/include/d-heap.h new file mode 100644 index 000000000..f8a92638c --- /dev/null +++ b/Basov_AS/lab_dijkstra/include/d-heap.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include + +#define maxSize 1000 +typedef int dataType; + +class Data { +public: + float priorities; +}; + +class DHeap { +protected: + Data** keys; // () + int d; // - + int lastIdx; // +public: + /* */ + DHeap(int d); + DHeap(const DHeap &heap); + ~DHeap(); + + int isFull(); + int isEmpty(); + + void add(Data *&key); // + void addSet(Data **key, int num); // + + Data* erase(); // + Data* erase(int i); // ... i- + + void transposition(int i, int j); // + void surfacing(int i); // + void immersion(int i); // + + void hilling(); // + +private: + int minChild(int i); // +}; + diff --git a/Basov_AS/lab_dijkstra/include/dijkstra.h b/Basov_AS/lab_dijkstra/include/dijkstra.h new file mode 100644 index 000000000..efb29595f --- /dev/null +++ b/Basov_AS/lab_dijkstra/include/dijkstra.h @@ -0,0 +1,16 @@ +#pragma once +#include "graph.h" +#include "d-heap.h" +#include "priority-queue.h" +#include + +class DataFloat : public Data { +public: + DataFloat(int v, float dist); + int v; +}; + +class Dijkstra { +public: + static void dijkstra(Graph *&graph, int s, float *&distance, int *&up); +}; \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/include/graph.h b/Basov_AS/lab_dijkstra/include/graph.h new file mode 100644 index 000000000..ac2184f08 --- /dev/null +++ b/Basov_AS/lab_dijkstra/include/graph.h @@ -0,0 +1,56 @@ +#include +#include +#include + +#define maxVerticesSize 1000 + + +class WeightedEdge { +public: + int nac_ver; // + int kon_ver; // + float weight; // N K + + WeightedEdge(int _nac_ver, int _kon_ver, float _weight); +}; + +class Graph { +private: + int vershini; // + int rebra; // + int tek_rebro; // + int tek_vershina; // + WeightedEdge** edges; // + int* vertices; // +public: + // + Graph(int n); + Graph(int n, int m); + ~Graph(); + + void generateGraph(float minRange, float maxRange); // + void addEdge(int N, int K, float weight); // + void removeEdge(int N, int K); // + + int getVerticesNum(); // + int getEdgeSize(); // + int getRealSize(); // + bool isConnectivity(); // + WeightedEdge** getEdgeSet(); // + WeightedEdge* getEdge(int j); // + float getWeight(int N, int K); // + void printList(); // + void printVertices(); // + + + /* */ +private: + void generateVertices(int &N, int &K); // + float generateWeight(float minRange, float maxRange); // + void cleaner(); // + int searchEdge(int _nac_ver, int _kon_ver); // + bool searchVershinu(int _ver); // ( ) + void addVershini(int _nac_ver, int _kon_ver); // + + +}; \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/include/priority-queue.h b/Basov_AS/lab_dijkstra/include/priority-queue.h new file mode 100644 index 000000000..ce92715cd --- /dev/null +++ b/Basov_AS/lab_dijkstra/include/priority-queue.h @@ -0,0 +1,32 @@ +#include "d-heap.h" + +class PriorityQueue { +public: + PriorityQueue() {}; + + virtual void push(Data *&key) = 0; + virtual Data* pop() = 0; + virtual void refresh() = 0; + + virtual int isFull() = 0; + virtual int isEmpty() = 0; +}; + + +/* D- */ +class DHeapBasedPriorityQueue : public PriorityQueue { +protected: + DHeap * heap; +public: + DHeapBasedPriorityQueue(int d = 4); + DHeapBasedPriorityQueue(const DHeapBasedPriorityQueue &queue); + DHeapBasedPriorityQueue(Data **keys, int num, int d = 4); + ~DHeapBasedPriorityQueue(); + + virtual void push(Data *&key); // + virtual Data* pop(); // + virtual void refresh(); // + + virtual int isFull(); + virtual int isEmpty(); +}; \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sample/sample_dijkstra.cpp b/Basov_AS/lab_dijkstra/sample/sample_dijkstra.cpp new file mode 100644 index 000000000..9d99b8cb3 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sample/sample_dijkstra.cpp @@ -0,0 +1,134 @@ +#include "dijkstra.h" +#include +#include + +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; +} \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/Dijkstra_sample/Dijkstra_sample.vcxproj b/Basov_AS/lab_dijkstra/sln/mp-lab/Dijkstra_sample/Dijkstra_sample.vcxproj new file mode 100644 index 000000000..61ea89e79 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/Dijkstra_sample/Dijkstra_sample.vcxproj @@ -0,0 +1,157 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {33487DFB-5572-4D7E-9563-D3A20967D41F} + Win32Proj + Dijkstrasample + 10.0.17134.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../../include + + + true + Console + ../Debug + dijkstra.lib;d-heap.lib;graph.lib;priority-queue.lib;%(AdditionalDependencies) + + + + + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + true + Console + + + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../../include + + + true + true + true + Console + ../Release + dijkstra.lib;d-heap.lib;graph.lib;priority-queue.lib;%(AdditionalDependencies) + + + + + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + true + true + true + Console + + + + + + + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/Dijkstra_sample/Dijkstra_sample.vcxproj.filters b/Basov_AS/lab_dijkstra/sln/mp-lab/Dijkstra_sample/Dijkstra_sample.vcxproj.filters new file mode 100644 index 000000000..7b209af51 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/Dijkstra_sample/Dijkstra_sample.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/d-heap/d-heap.vcxproj b/Basov_AS/lab_dijkstra/sln/mp-lab/d-heap/d-heap.vcxproj new file mode 100644 index 000000000..cea124a18 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/d-heap/d-heap.vcxproj @@ -0,0 +1,164 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82} + Win32Proj + dheap + 10.0.17134.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + + + + + + + Level3 + Disabled + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + true + true + + + + + + + Level3 + MaxSpeed + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/d-heap/d-heap.vcxproj.filters b/Basov_AS/lab_dijkstra/sln/mp-lab/d-heap/d-heap.vcxproj.filters new file mode 100644 index 000000000..b722c3fd9 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/d-heap/d-heap.vcxproj.filters @@ -0,0 +1,23 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + + + Файлы заголовков + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/dijkstra/dijkstra.vcxproj b/Basov_AS/lab_dijkstra/sln/mp-lab/dijkstra/dijkstra.vcxproj new file mode 100644 index 000000000..8e6fd1d4a --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/dijkstra/dijkstra.vcxproj @@ -0,0 +1,164 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {9F0F1F95-FA9D-4817-973E-6876339810D8} + Win32Proj + dijkstra + 10.0.17134.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + + + + + + + Level3 + Disabled + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + true + true + + + + + + + Level3 + MaxSpeed + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/dijkstra/dijkstra.vcxproj.filters b/Basov_AS/lab_dijkstra/sln/mp-lab/dijkstra/dijkstra.vcxproj.filters new file mode 100644 index 000000000..17d797fc1 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/dijkstra/dijkstra.vcxproj.filters @@ -0,0 +1,23 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + + + Файлы заголовков + + + + + Исходные файлы + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/graph/graph.vcxproj b/Basov_AS/lab_dijkstra/sln/mp-lab/graph/graph.vcxproj new file mode 100644 index 000000000..e923b863a --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/graph/graph.vcxproj @@ -0,0 +1,164 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273} + Win32Proj + graph + 10.0.17134.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + + + + + + + Level3 + Disabled + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + true + true + + + + + + + Level3 + MaxSpeed + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/graph/graph.vcxproj.filters b/Basov_AS/lab_dijkstra/sln/mp-lab/graph/graph.vcxproj.filters new file mode 100644 index 000000000..fc957e7f4 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/graph/graph.vcxproj.filters @@ -0,0 +1,23 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + + + Исходные файлы + + + + + Файлы заголовков + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/mp-lab.sln b/Basov_AS/lab_dijkstra/sln/mp-lab/mp-lab.sln new file mode 100644 index 000000000..3a94eefe3 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/mp-lab.sln @@ -0,0 +1,77 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27703.2018 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "d-heap", "d-heap\d-heap.vcxproj", "{B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "graph", "graph\graph.vcxproj", "{9E46D6FB-0DB3-44A0-96AB-798B28F8C273}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "priority-queue", "priority-queue\priority-queue.vcxproj", "{3FF27136-30FA-4472-AD3D-AD97A74DFCE0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dijkstra", "dijkstra\dijkstra.vcxproj", "{9F0F1F95-FA9D-4817-973E-6876339810D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dijkstra_sample", "Dijkstra_sample\Dijkstra_sample.vcxproj", "{33487DFB-5572-4D7E-9563-D3A20967D41F}" + ProjectSection(ProjectDependencies) = postProject + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0} = {3FF27136-30FA-4472-AD3D-AD97A74DFCE0} + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82} = {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82} + {9F0F1F95-FA9D-4817-973E-6876339810D8} = {9F0F1F95-FA9D-4817-973E-6876339810D8} + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273} = {9E46D6FB-0DB3-44A0-96AB-798B28F8C273} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Debug|x64.ActiveCfg = Debug|x64 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Debug|x64.Build.0 = Debug|x64 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Debug|x86.ActiveCfg = Debug|Win32 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Debug|x86.Build.0 = Debug|Win32 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Release|x64.ActiveCfg = Release|x64 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Release|x64.Build.0 = Release|x64 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Release|x86.ActiveCfg = Release|Win32 + {B1D6DF3E-AB6D-4B20-A937-EF5AB0E90E82}.Release|x86.Build.0 = Release|Win32 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Debug|x64.ActiveCfg = Debug|x64 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Debug|x64.Build.0 = Debug|x64 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Debug|x86.ActiveCfg = Debug|Win32 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Debug|x86.Build.0 = Debug|Win32 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Release|x64.ActiveCfg = Release|x64 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Release|x64.Build.0 = Release|x64 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Release|x86.ActiveCfg = Release|Win32 + {9E46D6FB-0DB3-44A0-96AB-798B28F8C273}.Release|x86.Build.0 = Release|Win32 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Debug|x64.ActiveCfg = Debug|x64 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Debug|x64.Build.0 = Debug|x64 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Debug|x86.ActiveCfg = Debug|Win32 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Debug|x86.Build.0 = Debug|Win32 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Release|x64.ActiveCfg = Release|x64 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Release|x64.Build.0 = Release|x64 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Release|x86.ActiveCfg = Release|Win32 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0}.Release|x86.Build.0 = Release|Win32 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Debug|x64.ActiveCfg = Debug|x64 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Debug|x64.Build.0 = Debug|x64 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Debug|x86.ActiveCfg = Debug|Win32 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Debug|x86.Build.0 = Debug|Win32 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Release|x64.ActiveCfg = Release|x64 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Release|x64.Build.0 = Release|x64 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Release|x86.ActiveCfg = Release|Win32 + {9F0F1F95-FA9D-4817-973E-6876339810D8}.Release|x86.Build.0 = Release|Win32 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Debug|x64.ActiveCfg = Debug|x64 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Debug|x64.Build.0 = Debug|x64 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Debug|x86.ActiveCfg = Debug|Win32 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Debug|x86.Build.0 = Debug|Win32 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Release|x64.ActiveCfg = Release|x64 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Release|x64.Build.0 = Release|x64 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Release|x86.ActiveCfg = Release|Win32 + {33487DFB-5572-4D7E-9563-D3A20967D41F}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B66CEF47-D722-4A38-8298-A77D24150126} + EndGlobalSection +EndGlobal diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/priority-queue/priority-queue.vcxproj b/Basov_AS/lab_dijkstra/sln/mp-lab/priority-queue/priority-queue.vcxproj new file mode 100644 index 000000000..0a9366974 --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/priority-queue/priority-queue.vcxproj @@ -0,0 +1,164 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {3FF27136-30FA-4472-AD3D-AD97A74DFCE0} + Win32Proj + priorityqueue + 10.0.17134.0 + + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + StaticLibrary + true + v141 + Unicode + + + StaticLibrary + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + + + + + + + Level3 + Disabled + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + ../../../include + + + Windows + true + true + true + + + + + + + Level3 + MaxSpeed + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/sln/mp-lab/priority-queue/priority-queue.vcxproj.filters b/Basov_AS/lab_dijkstra/sln/mp-lab/priority-queue/priority-queue.vcxproj.filters new file mode 100644 index 000000000..b18970afb --- /dev/null +++ b/Basov_AS/lab_dijkstra/sln/mp-lab/priority-queue/priority-queue.vcxproj.filters @@ -0,0 +1,23 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + + + Исходные файлы + + + + + Файлы заголовков + + + \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/src/d-heap.cpp b/Basov_AS/lab_dijkstra/src/d-heap.cpp new file mode 100644 index 000000000..6217319f1 --- /dev/null +++ b/Basov_AS/lab_dijkstra/src/d-heap.cpp @@ -0,0 +1,146 @@ +#include "d-heap.h" + +DHeap::DHeap(int d) +{ + if (d <= 0) + throw "DHeap: Nevernaya D-Arnost"; + this->d = d; + lastIdx = -1; + keys = new Data*[maxSize]; +} + +DHeap::DHeap(const DHeap &heap) +{ + this->d = heap.d; + keys = new Data*[maxSize]; + for (int i = 0; i <= heap.lastIdx; i++) + keys[i] = heap.keys[i]; + this->lastIdx = heap.lastIdx; +} + +DHeap::~DHeap() +{ + delete[] keys; +} + +int DHeap::isFull() +{ + return lastIdx >= maxSize - 1; +} + +int DHeap::isEmpty() +{ + return lastIdx == -1; +} + +void DHeap::add(Data *&key) +{ + if (isFull()) + throw "DHeap: No memory"; + lastIdx++; + keys[lastIdx] = key; + surfacing(lastIdx); +} + +void DHeap::addSet(Data **key, int num) +{ + if (lastIdx + num >= maxSize) + throw "DHeap: Too large set!"; + for (int i = lastIdx + 1; i < lastIdx + num + 1; i++) + { + keys[i] = key[i - lastIdx - 1]; + } + lastIdx += num; + hilling(); +} + +Data* DHeap::erase() +{ + if (isEmpty()) + throw "DHeap: Net dannih!"; + Data* key = keys[lastIdx]; + lastIdx--; + return key; +} + +Data* DHeap::erase(int i) +{ + if (isEmpty()) + throw "DHeap: No data!"; + if ((i < 0) || (i > lastIdx)) + throw "DHeap: Neverniy index"; + + Data* key = keys[i]; + if (i == lastIdx) + { + lastIdx--; + return key; + } + transposition(i, lastIdx); + lastIdx--; + immersion(i); + return key; +} + +void DHeap::transposition(int i, int j) +{ + if ((i < 0) || (j < 0) || (i > lastIdx) || (j > lastIdx)) + throw "DHeap: Neverniy indexi"; + Data* tmp = keys[i]; + keys[i] = keys[j]; + keys[j] = tmp; +} + +void DHeap::surfacing(int i) +{ + if ((i < 0) || (i > lastIdx)) + throw "DHeap: Neverniy index"; + + int p = (i - 1) / d; + while (i > 0) { + if (keys[p]->priorities < keys[i]->priorities) + break; + transposition(p, i); + i = p; + p = (i - 1) / d; + } +} + +void DHeap::immersion(int i) +{ + if ((i < 0) || (i > lastIdx)) + throw "DHeap: Neverniy index"; + + int c = minChild(i); + while ((c != -1) && (keys[c]->priorities < keys[i]->priorities)) { + transposition(i, c); + i = c; + c = minChild(i); + } +} + +void DHeap::hilling() +{ + for (int i = lastIdx; i >= 0; i--) + immersion(i); +} + +int DHeap::minChild(int i) +{ + int f = i * d + 1; + if (f > lastIdx) + return -1; + + int l = std::min(i*d + d, lastIdx); + int c; + + Data* minKey = keys[f]; + c = f; + for (int k = f + 1; k <= l; k++) { + if (minKey->priorities > keys[k]->priorities) { + minKey = keys[k]; + c = k; + } + } + return c; +} \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/src/dheap-based-priority-queue.cpp b/Basov_AS/lab_dijkstra/src/dheap-based-priority-queue.cpp new file mode 100644 index 000000000..cfe609dae --- /dev/null +++ b/Basov_AS/lab_dijkstra/src/dheap-based-priority-queue.cpp @@ -0,0 +1,48 @@ +#include "priority-queue.h" + +DHeapBasedPriorityQueue::DHeapBasedPriorityQueue(int d) +{ + heap = new DHeap(d); +} + +DHeapBasedPriorityQueue::DHeapBasedPriorityQueue(const DHeapBasedPriorityQueue &queue) +{ + this->heap = new DHeap(*(queue.heap)); +} + +DHeapBasedPriorityQueue::DHeapBasedPriorityQueue(Data **keys, int num, int d) +{ + heap = new DHeap(d); + heap->addSet(keys, num); +} + +DHeapBasedPriorityQueue::~DHeapBasedPriorityQueue() +{ + delete heap; +} + +void DHeapBasedPriorityQueue::push(Data *&key) +{ + heap->add(key); +} + +Data* DHeapBasedPriorityQueue::pop() +{ + return heap->erase(0); +} + +void DHeapBasedPriorityQueue::refresh() +{ + heap->hilling(); +} + +int DHeapBasedPriorityQueue::isFull() +{ + return heap->isFull(); +} + +int DHeapBasedPriorityQueue::isEmpty() +{ + return heap->isEmpty(); +} + diff --git a/Basov_AS/lab_dijkstra/src/dijkstra.cpp b/Basov_AS/lab_dijkstra/src/dijkstra.cpp new file mode 100644 index 000000000..a156439d9 --- /dev/null +++ b/Basov_AS/lab_dijkstra/src/dijkstra.cpp @@ -0,0 +1,63 @@ +#include "Dijkstra.h" + +DataFloat::DataFloat(int v, float dist) +{ + this->v = v; + priorities = dist; +} + +void Dijkstra::dijkstra(Graph *&graph, int s, float *&distance, int *&up) +{ + int n = graph->getVerticesNum(); // + int m = graph->getRealSize(); // + if ((s < 0) || (s >= n)) + throw "Dijkstra: Nevernaya startovaya vershina"; + + Data** dist = new Data*[n]; + up = new int[n]; + + PriorityQueue *queue = new DHeapBasedPriorityQueue(); + + for (int i = 0; i < n; i++) { + up[i] = i; + dist[i] = new DataFloat(i, FLT_MAX); + if (i == s) + dist[s]->priorities = 0; + queue->push(dist[i]); + } + + WeightedEdge** edges = graph->getEdgeSet(); + while (!queue->isEmpty()) + { + int vConsidered = ((DataFloat*)queue->pop())->v; // + float delta; + + for (int i = 0; i < m; i++) + { + int vIncident = -1; // + if (edges[i]->kon_ver == vConsidered) + vIncident = edges[i]->nac_ver; + if (edges[i]->nac_ver == vConsidered) + vIncident = edges[i]->kon_ver; + if (vIncident == -1) continue; + + float way = dist[vConsidered]->priorities + graph->getWeight(vConsidered, vIncident); + delta = dist[vIncident]->priorities - way; + if (delta > 0) + { + dist[vIncident]->priorities = way; + up[vIncident] = vConsidered; + queue->refresh(); + } + } + } + + distance = new float[n]; + for (int i = 0; i < n; i++) + distance[i] = dist[i]->priorities; + + for (int i = 0; i < n; i++) + delete dist[i]; + delete[]dist; + delete queue; +} \ No newline at end of file diff --git a/Basov_AS/lab_dijkstra/src/graph.cpp b/Basov_AS/lab_dijkstra/src/graph.cpp new file mode 100644 index 000000000..3d4951c1a --- /dev/null +++ b/Basov_AS/lab_dijkstra/src/graph.cpp @@ -0,0 +1,218 @@ +#include "graph.h" + +WeightedEdge::WeightedEdge(int _nac_ver, int _kon_ver, float _weight) +{ + this->kon_ver = _kon_ver; + this->nac_ver = _nac_ver; + this->weight = _weight; +} + +Graph::Graph(int _vershini) +{ + if ((_vershini < 0) || (_vershini > maxVerticesSize)) + throw "Graph: Nepravilnoe chislo vershin"; + else + this->vershini = _vershini; + this->rebra = _vershini * (_vershini - 1) / 2; + tek_rebro = 0; + vertices = new int[_vershini]; + edges = new WeightedEdge*[rebra]; +} + +Graph::Graph(int _vershini, int _rebra) +{ + if ((_vershini < 0) || (_vershini > maxVerticesSize)) + throw "Graph: Nepravilnoe chislo vershin"; + else + this->vershini = _vershini; + + if ((_rebra < 0) || (_rebra > _vershini*(_vershini - 1) / 2) || (_rebra < _vershini - 1)) + throw "Graph: Nepravilnoe chislo reber"; + else + this->rebra = _rebra; + + tek_rebro = 0; + tek_vershina = 0; + + vertices = new int[_vershini]; + for (int i = 0; i < _vershini-1; i++) vertices[i] = -1; + edges = new WeightedEdge*[_rebra]; +} + + +Graph::~Graph() { + cleaner(); + delete[] edges; + delete[] vertices; +} + + +int Graph::searchEdge(int _nac_ver, int _kon_ver) +{ + for (int i = 0; i < tek_rebro; i++) { + if ((edges[i]->kon_ver == _kon_ver) && + (edges[i]->nac_ver == _nac_ver) || + (edges[i]->nac_ver == _kon_ver) && + (edges[i]->kon_ver == _nac_ver)) + return i; + } + return -1; +} + +bool Graph::searchVershinu(int _ver) +{ + for (int i = 0; i < tek_rebro; i++) { + if ((edges[i]->nac_ver == _ver) || + edges[i]->kon_ver == _ver) + return true; + } + return false; +} + +void Graph::addVershini(int _nac_ver, int _kon_ver) +{ + if (!searchVershinu(_nac_ver)) { + vertices[tek_vershina] = _nac_ver; + tek_vershina++; + } + if (!searchVershinu(_kon_ver)) { + vertices[tek_vershina] = _kon_ver; + tek_vershina++; + } +} + +void Graph::generateVertices(int & _nac_ver, int & _kon_ver) +{ + do { + _nac_ver = rand() % vershini; + _kon_ver = rand() % vershini; + } while ((_nac_ver == _kon_ver) || (searchEdge(_nac_ver, _kon_ver) != -1)); +} + +float Graph::generateWeight(float minRange, float maxRange) +{ + double d = minRange; + double c = (double)(maxRange - minRange) / RAND_MAX; + double result = c * rand() + d; + return result; +} + +void Graph::cleaner() +{ + for (int i = 0; i < tek_rebro; i++) + delete edges[i]; +} + +void Graph::generateGraph(float minRange, float maxRange) +{ + int nac_ver; + int kon_ver; + float weight; + + if (minRange > maxRange) + throw "Graph: Invalid ranges"; + + if (tek_rebro) { // + cleaner(); + tek_rebro = 0; + } + + srand(time(NULL)); + for (int i = 0; i < rebra; i++) { + generateVertices(nac_ver, kon_ver); + weight = generateWeight(minRange, maxRange); + edges[i] = new WeightedEdge(nac_ver, kon_ver, weight); + addVershini(nac_ver, kon_ver); + tek_rebro++; + } +} + + +void Graph::addEdge(int _nac_ver, int _kon_ver, float _weight) +{ + if (tek_rebro == rebra) + throw "Graph: Graph polniy"; + if (_nac_ver == _kon_ver) + throw "Graph: Nelzya cikly"; + if (searchEdge(_nac_ver, _kon_ver) != -1) + throw "Graph: Ne dostupni neskolko re"; + edges[tek_rebro] = new WeightedEdge(_nac_ver, _kon_ver, _weight); + addVershini(_nac_ver, _kon_ver); + tek_rebro++; +} + +void Graph::removeEdge(int _nac_ver, int _kon_ver) +{ + int j = searchEdge(_nac_ver, _kon_ver); + if (j == -1) + throw "Graph: Popytka ydaleniya ne sush. rebra"; + delete edges[j]; + edges[j] = edges[tek_rebro - 1]; + tek_rebro--; +} + +int Graph::getVerticesNum() +{ + return vershini; +} + +int Graph::getEdgeSize() +{ + return rebra; +} + +int Graph::getRealSize() +{ + return tek_rebro; +} + +bool Graph::isConnectivity() +{ + for (int i = 0; i < vershini; i++) + if (vertices[i] < 0) return false; + return true; +} + +WeightedEdge** Graph::getEdgeSet() +{ + if (tek_rebro == 0) + return 0; + return edges; +} + +WeightedEdge* Graph::getEdge(int j) +{ + return edges[j]; +} + +float Graph::getWeight(int _nac_ver, int _kon_ver) +{ + int j = searchEdge(_nac_ver, _kon_ver); + if (j == -1) + throw "Graph: Nevernoe rebro"; + return edges[j]->weight; +} + +void Graph::printList() +{ + using namespace std; + for (int i = 0; i < vershini; i++) + { + cout << i << " : "; + for (int j = 0; j < tek_rebro; j++) + { + if (edges[j]->nac_ver == i) + cout << edges[j]->kon_ver << '(' << edges[j]->weight << ')' << ", "; + if (edges[j]->kon_ver == i) + cout << edges[j]->nac_ver << '(' << edges[j]->weight << ')' << ", "; + } + cout << endl; + } +} + +void Graph::printVertices() +{ + using namespace std; + for (int i = 0; i < vershini; i++) cout << vertices[i] << " "; + cout << endl; +} diff --git a/README.md b/README.md index b0696542d..390d06d19 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Репозиторий для сдачи лабораторных работ по курсу "Алгоритмы и структуры данных" +# Репозиторий для сдачи лабораторных работ по курсу "Алгоритмы и структуры данных".