int igraph_i_cb_components(igraph_t *graph, const igraph_vector_bool_t *excluded, igraph_vector_long_t *components, long int *no, /* working area follows */ igraph_vector_long_t *compid, igraph_dqueue_t *Q, igraph_vector_t *neis) { long int no_of_nodes=igraph_vcount(graph); long int i; long int cno=0; igraph_vector_long_clear(components); igraph_dqueue_clear(Q); IGRAPH_CHECK(igraph_vector_long_resize(compid, no_of_nodes)); igraph_vector_long_null(compid); for (i=0; i<no_of_nodes; i++) { if (VECTOR(*compid)[i]) { continue; } if (VECTOR(*excluded)[i]) { continue; } IGRAPH_CHECK(igraph_dqueue_push(Q, i)); IGRAPH_CHECK(igraph_vector_long_push_back(components, i)); VECTOR(*compid)[i] = ++cno; while (!igraph_dqueue_empty(Q)) { igraph_integer_t node=(igraph_integer_t) igraph_dqueue_pop(Q); long int j, n; IGRAPH_CHECK(igraph_neighbors(graph, neis, node, IGRAPH_ALL)); n=igraph_vector_size(neis); for (j=0; j<n; j++) { long int v=(long int) VECTOR(*neis)[j]; if (VECTOR(*excluded)[v]) { if (VECTOR(*compid)[v] != cno) { VECTOR(*compid)[v] = cno; IGRAPH_CHECK(igraph_vector_long_push_back(components, v)); } } else { if (!VECTOR(*compid)[v]) { VECTOR(*compid)[v] = cno; /* could be anything positive */ IGRAPH_CHECK(igraph_vector_long_push_back(components, v)); IGRAPH_CHECK(igraph_dqueue_push(Q, v)); } } } } /* while !igraph_dqueue_empty */ IGRAPH_CHECK(igraph_vector_long_push_back(components, -1)); } /* for i<no_of_nodes */ *no=cno; return 0; }
int igraph_vector_round(const igraph_vector_t *from, igraph_vector_long_t *to) { long int i, n=igraph_vector_size(from); IGRAPH_CHECK(igraph_vector_long_resize(to, n)); for (i=0; i<n; i++) { VECTOR(*to)[i] = round(VECTOR(*from)[i]); } return 0; }