/** * Deallocates a graph, including deallocating all of the nodes and edges * associated with the graph. */ void graph_destroy(graph *g) { if (!g) return; if (g->nodes) { int i; for (i = 0; i < g->nodes->nnodes; i++) { if (g->nodes->node[i]) node_recursive_destroy(g->nodes->node[i]); } node_array_destroy(g->nodes); } if (g->edges) { int i; for (i = 0; i < g->edges->nedges; i++) edge_destroy(g->edges->edge[i]); edge_array_destroy(g->edges); } if (g->matrix) free(g->matrix); free(g); }
unsigned int graph_connected_components(graph_t g) { unsigned int classes_count = 0, n, m, left, right; union_find_t uf; edge_t *edges; n = graph_vertices_count(g); m = graph_edges_count(g); uf = union_find_create(n); edges = graph_edges(g); for (unsigned int i = 0; i < m; i++) { left = vertex_label(edge_left_vertex(edges[i])); right = vertex_label(edge_right_vertex(edges[i])); left = union_find_find(uf, left); right = union_find_find(uf, right); if (!union_find_connected(uf, left, right)) { union_find_union(uf, left, right); } edges[i] = edge_destroy(edges[i]); } free(edges); classes_count = union_find_count(uf); uf = union_find_destroy(uf); return (classes_count); }
END_TEST START_TEST(test_network_add_edge_null) { Edge *edge = NULL; edge = edge_create(0, 0, 1, 0); network_add_edge(NULL, edge); edge_destroy(edge); }
bool graph_has_cycle(graph_t g) { bool has_secondary_edge; edge_t *edges; unsigned int i, m; edges = graph_edges(g); has_secondary_edge = false; i = 0; m = graph_edges_count(g); while (!has_secondary_edge && i < m) { has_secondary_edge = !edge_is_primary(edges[i]); edges[i] = edge_destroy(edges[i]); i += 1; } while (i < m) { edges[i] = edge_destroy(edges[i]); i += 1; } free(edges); return (has_secondary_edge); }
unsigned int mst_total_weight(graph_t mst) { unsigned int result = 0, num_edges; edge_t *edges; num_edges = graph_edges_count(mst); edges = graph_edges(mst); for (unsigned int i = 0; i < num_edges; i++) { if (edge_is_primary(edges[i])) { result += edge_weight(edges[i]); } edges[i] = edge_destroy(edges[i]); } free(edges); return result; }
unsigned int mst_total_weight(graph_t mst) { /* Returns the sum of the weights of all the primary * edges of the given graph. */ unsigned int sum, m; edge_t *edges; edges = graph_edges(mst); sum = 0; m = graph_edges_count(mst); for (unsigned int i = 0; i < m; i++) { if (edge_is_primary(edges[i])) { sum += edge_weight(edges[i]); } edges[i] = edge_destroy(edges[i]); } free(edges); return (sum); }
void gts_edge_remove(GtsEdge *edge) { edge->segment.v1->segments = g_slist_remove(edge->segment.v1->segments, &edge->segment); edge->segment.v2->segments = g_slist_remove(edge->segment.v2->segments, &edge->segment); edge_destroy(GTS_OBJECT (edge)); }