@@ -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