main.cpp (3566B)
1 #include <algorithm> 2 #include <thread> 3 #include <chrono> 4 #include <ctime> 5 #include <time.h> 6 #include <iostream> 7 #include <cstdint> 8 #include <raylib.h> 9 #include <stdlib.h> 10 #include <time.h> 11 #include <unordered_map> 12 #include <unordered_set> 13 #include <vector> 14 #include "draw.h" 15 16 #define VERTICES 100 17 #define EDGES 1000 18 19 std::unordered_map<std::uintptr_t, std::vector<Edge*>> getMap(Vertex* verts, Edge* edges, int edgeCount, int vertCount) { 20 21 std::unordered_map<std::uintptr_t, std::vector<Edge*>> res {}; 22 23 for(int i = 0; i < vertCount; ++i) { 24 Vertex* vert = &verts[i]; 25 res[std::uintptr_t(vert)] = std::vector<Edge*>{}; 26 } 27 28 29 for (int i = 0; i < edgeCount; ++i) { 30 Edge& e = edges[i]; 31 res[std::uintptr_t(e.v1)].push_back(&e); 32 res[std::uintptr_t(e.v2)].push_back(&e); 33 } 34 35 return res; 36 } 37 38 void visit_vertex( 39 Vertex* v, 40 const std::vector<Edge*>& edges, 41 std::vector<Edge*>& visitHeap, 42 std::unordered_set<std::uintptr_t>& visited 43 ) { 44 45 v->visited = true; 46 47 visited.insert(uintptr_t(v)); 48 for(Edge* edge: edges) { 49 visitHeap.push_back(edge); 50 51 auto cmp = [](Edge* a, Edge* b) { 52 // this makes it a min heap bc < 53 return a->weight < b->weight; 54 }; 55 56 std::push_heap(visitHeap.begin(), visitHeap.end(), cmp); 57 } 58 return; 59 } 60 61 // create vertices 62 // create weighted edge list 63 // associated edges with both vertices 64 // undirected graph 65 // start with arbitrary element 66 // push edges into an array 67 // search array for smallest element 68 // explore 69 int main(void) 70 { 71 72 srand(time(0)); 73 InitWindow(5120, 1440, "Raylib background animation window"); 74 75 while (!WindowShouldClose()) 76 { 77 Vertex* vertices = gen_vertices(VERTICES); 78 Edge* edges = gen_edges(vertices, VERTICES, EDGES); 79 auto mp = getMap(vertices,edges,EDGES,VERTICES); 80 81 std::unordered_set<std::uintptr_t> visited {}; 82 std::vector<Edge*> visitHeap; 83 84 visit_vertex(&vertices[0], mp[uintptr_t(&vertices[0])], visitHeap, visited); 85 bool done = false; 86 87 while(!done) { 88 89 BeginDrawing(); 90 ClearBackground(BLACK); 91 draw_edges(edges,EDGES); 92 draw_vertices(vertices,VERTICES); 93 EndDrawing(); 94 std::this_thread::sleep_for(std::chrono::seconds(1)); 95 96 std::vector<Edge*> currentHeap = visitHeap; 97 visitHeap.clear(); 98 99 auto cmp = [](Edge* a, Edge* b) { 100 return a->weight < b->weight; 101 }; 102 std::pop_heap(visitHeap.begin(), visitHeap.end(), cmp); 103 104 Edge* vis = visitHeap.back(); 105 visitHeap.pop_back(); 106 107 if(visited.find(uintptr_t(vis->v1)) == visited.end() && visited.find(uintptr_t(vis->v2)) == visited.end()) { 108 continue; 109 } 110 111 if(visited.find(uintptr_t(vis->v1)) != visited.end() && visited.find(uintptr_t(vis->v2)) != visited.end()) { 112 continue; 113 } 114 115 116 Vertex* visiting = nullptr; 117 118 if(visited.find(uintptr_t(vis->v1)) == visited.end()){ 119 visited.insert(uintptr_t(vis->v1)); 120 visiting = vis->v1; 121 } else { 122 visited.insert(uintptr_t(vis->v2)); 123 visiting = vis->v2; 124 } 125 vis->traversed = true; 126 visit_vertex(visiting, mp[uintptr_t(visiting)], visitHeap, visited); 127 } 128 129 free(vertices); 130 free(edges); 131 } 132 133 CloseWindow(); 134 return 0; 135 }