예제 #1
0
/**
 * 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);
}
예제 #2
0
파일: main.c 프로젝트: Tinix/kruskal
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);
}
예제 #3
0
파일: test_network.c 프로젝트: tomyo/Dinic
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);
}
예제 #4
0
파일: main.c 프로젝트: Tinix/kruskal
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);
}
예제 #5
0
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;
}
예제 #6
0
파일: main.c 프로젝트: Tinix/kruskal
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);
}
예제 #7
0
파일: edge.c 프로젝트: BenBergman/geda-pcb
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));
}