@@ -204,7 +204,26 @@ static PyObject* minimum_spanning_tree_prim_adjacency_list(PyObject* self, PyObj
204204    for  (const  auto & [adj_name, _] : start_node->adjacent ) {
205205        std::string key = make_edge_key (start, adj_name);
206206        GraphEdge* edge = graph->edges [key];
207-         pq.push ({start, adj_name, edge->value , edge->value_type });
207+         EdgeTuple et;
208+         et.source  = start;
209+         et.target  = adj_name;
210+         et.value_type  = edge->value_type ;
211+ 
212+         switch  (edge->value_type ) {
213+             case  DataType::Int:
214+                 et.value  = std::get<int64_t >(edge->value );
215+                 break ;
216+             case  DataType::Double:
217+                 et.value  = std::get<double >(edge->value );
218+                 break ;
219+             case  DataType::String:
220+                 et.value  = std::get<std::string>(edge->value );
221+                 break ;
222+             default :
223+                 et.value  = std::monostate{};
224+         }
225+ 
226+         pq.push (et);
208227    }
209228
210229    while  (!pq.empty ()) {
@@ -233,20 +252,24 @@ static PyObject* minimum_spanning_tree_prim_adjacency_list(PyObject* self, PyObj
233252
234253        std::string key_uv = make_edge_key (edge.source , edge.target );
235254        GraphEdge* new_edge = PyObject_New (GraphEdge, &GraphEdgeType);
255+         PyObject_Init (reinterpret_cast <PyObject*>(new_edge), &GraphEdgeType);
256+         new  (&new_edge->value ) std::variant<std::monostate, int64_t , double , std::string>(edge.value );
257+         new_edge->value_type  = edge.value_type ;
236258        Py_INCREF (u);
237259        Py_INCREF (v);
238260        new_edge->source  = reinterpret_cast <PyObject*>(u);
239261        new_edge->target  = reinterpret_cast <PyObject*>(v);
240-         new  (&new_edge->value ) std::variant<std::monostate, int64_t , double , std::string>(edge.value );
241-         new_edge->value_type  = edge.value_type ;
242262        mst->edges [key_uv] = new_edge;
243263
244264        std::string key_vu = make_edge_key (edge.target , edge.source );
245265        GraphEdge* new_edge_rev = PyObject_New (GraphEdge, &GraphEdgeType);
246-         new_edge_rev->source  = reinterpret_cast <PyObject*>(v);
247-         new_edge_rev->target  = reinterpret_cast <PyObject*>(u);
266+         PyObject_Init (reinterpret_cast <PyObject*>(new_edge_rev), &GraphEdgeType);
248267        new  (&new_edge_rev->value ) std::variant<std::monostate, int64_t , double , std::string>(edge.value );
249268        new_edge_rev->value_type  = edge.value_type ;
269+         Py_INCREF (u);
270+         Py_INCREF (v);
271+         new_edge_rev->source  = reinterpret_cast <PyObject *>(v);
272+         new_edge_rev->target  = reinterpret_cast <PyObject*>(u);
250273        mst->edges [key_vu] = new_edge_rev;
251274
252275        AdjacencyListGraphNode* next_node = graph->node_map [edge.target ];
@@ -255,10 +278,27 @@ static PyObject* minimum_spanning_tree_prim_adjacency_list(PyObject* self, PyObj
255278            if  (visited.count (adj_name)) continue ;
256279            std::string key = make_edge_key (edge.target , adj_name);
257280            GraphEdge* adj_edge = graph->edges [key];
258-             pq.push ({edge.target , adj_name, adj_edge->value , adj_edge->value_type });
281+             EdgeTuple adj_et;
282+             adj_et.source  = edge.target ;
283+             adj_et.target  = adj_name;
284+             adj_et.value_type  = adj_edge->value_type ;
285+ 
286+             switch  (adj_edge->value_type ) {
287+                 case  DataType::Int:
288+                     adj_et.value  = std::get<int64_t >(adj_edge->value );
289+                     break ;
290+                 case  DataType::Double:
291+                     adj_et.value  = std::get<double >(adj_edge->value );
292+                     break ;
293+                 case  DataType::String:
294+                     adj_et.value  = std::get<std::string>(adj_edge->value );
295+                     break ;
296+                 default :
297+                     adj_et.value  = std::monostate{};
298+             }
299+ 
300+             pq.push (adj_et);
259301        }
260302    }
261- 
262-     Py_INCREF (mst);
263303    return  reinterpret_cast <PyObject*>(mst);
264304}
0 commit comments