*/
xbt_graph_t xbt_graph_new_graph(unsigned short int directed, void *data)
{
- xbt_graph_t graph = NULL;
- graph = xbt_new0(struct xbt_graph, 1);
+ xbt_graph_t graph = xbt_new0(struct xbt_graph, 1);
graph->directed = directed;
graph->data = data;
graph->nodes = xbt_dynar_new(sizeof(xbt_node_t), NULL);
/** @brief add a node to the given graph */
xbt_node_t xbt_graph_new_node(xbt_graph_t g, void *data)
{
- xbt_node_t node = NULL;
- node = xbt_new0(struct xbt_node, 1);
+ xbt_node_t node= xbt_new0(struct xbt_node, 1);
node->data = data;
if (g->directed)
/* only the "out" field is used */
/** @brief add an edge to the given graph */
xbt_edge_t xbt_graph_new_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst, void *data)
{
- xbt_edge_t edge = NULL;
-
- edge = xbt_new0(struct xbt_edge, 1);
+ xbt_edge_t edge = xbt_new0(struct xbt_edge, 1);
xbt_dynar_push(src->out, &edge);
if (g->directed)
xbt_dynar_push(dst->in, &edge);
*
* From wikipedia:
*
- * The Floyd–Warshall algorithm takes as input an adjacency matrix representation of a weighted, directed graph (V, E).
+ * The Floyd-Warshall algorithm takes as input an adjacency matrix representation of a weighted, directed graph (V, E).
* The weight of a path between two vertices is the sum of the weights of the edges along that path. The edges E of the
* graph may have negative weights, but the graph must not have any negative weight cycles. The algorithm computes, for
* each pair of vertices, the minimum weight among all paths between the two vertices. The running time complexity is
*/
void xbt_floyd_algorithm(xbt_graph_t g, double *adj, double *d, xbt_node_t * p)
{
- unsigned long i, j, k;
- unsigned long n;
- n = xbt_dynar_length(g->nodes);
-
-# define D(u,v) d[(u)*n+(v)]
-# define P(u,v) p[(u)*n+(v)]
+ unsigned long i;
+ unsigned long j;
+ unsigned long k;
+ unsigned long n = xbt_dynar_length(g->nodes);
for (i = 0; i < n * n; i++) {
d[i] = adj[i];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
- if (D(i, j) != -1) {
- P(i, j) = *((xbt_node_t *) xbt_dynar_get_ptr(g->nodes, i));
+ if (d[i*n+j] > -1) {
+ p[i*n+j] = *((xbt_node_t *) xbt_dynar_get_ptr(g->nodes, i));
}
}
}
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
- if ((D(i, k) != -1) && (D(k, j) != -1)) {
- if ((D(i, j) == -1) || (D(i, j) > D(i, k) + D(k, j))) {
- D(i, j) = D(i, k) + D(k, j);
- P(i, j) = P(k, j);
+ if ((d[i*n+k] > -1) && (d[k*n+j] > -1)) {
+ if ((d[i*n+j] < 0) || (d[i*n+j] > d[i*n+k] + d[k*n+j])) {
+ d[i*n+j] = d[i*n+k] + d[k*n+j];
+ p[i*n+j] = p[k*n+j];
}
}
}
}
}
-# undef P
-# undef D
}
/** @brief Export the given graph in the GraphViz formatting for visualization */
unsigned int cursor = 0;
xbt_node_t node = NULL;
xbt_edge_t edge = NULL;
- FILE *file = NULL;
const char *name = NULL;
- file = fopen(filename, "w");
+ FILE *file = fopen(filename, "w");
xbt_assert(file, "Failed to open %s \n", filename);
if (g->directed)
}else{
c = c_ndir;
}
- const char *src_name, *dst_name;
if (node_name){
- src_name = node_name(edge->src);
- dst_name = node_name(edge->dst);
+ const char *src_name = node_name(edge->src);
+ const char *dst_name = node_name(edge->dst);
fprintf(file, " \"%s\" %s \"%s\"", src_name, c, dst_name);
}else{
fprintf(file, " \"%p\" %s \"%p\"", edge->src, c, edge->dst);
}
- if ((edge_name) && ((name = edge_name(edge))))
- fprintf(file, "[label=\"%s\"]", name);
+ if (edge_name){
+ name = edge_name(edge);
+ if (name)
+ fprintf(file, "[label=\"%s\"]", name);
+ }
fprintf(file, ";\n");
}
fprintf(file, "}\n");