Матрица инцидентности по краю вершины достаточно проста для построения.Просто зациклите все ребра и добавьте необходимые элементы матрицы для каждого.
В зависимости от того, зачем вам нужна эта матрица, вы можете использовать для этого разреженную структуру данных матрицы.У igraph есть два разреженных типа матрицы.
Для простоты здесь я покажу пример с типом данных плотной матрицы igraph_matrix_t
.
#include <igraph.h>
#include <stdio.h>
void print_matrix(igraph_matrix_t *m, FILE *f) {
long int i, j;
for (i=0; i<igraph_matrix_nrow(m); i++) {
for (j=0; j<igraph_matrix_ncol(m); j++) {
fprintf(f, " %li", (long int)MATRIX(*m, i, j));
}
fprintf(f, "\n");
}
}
int main() {
igraph_t graph;
igraph_integer_t vcount, ecount, i;
igraph_matrix_t incmat;
igraph_ring(&graph, 10, 0, 0, 0);
vcount = igraph_vcount(&graph);
ecount = igraph_ecount(&graph);
/* this also sets matrix elements to zeros */
igraph_matrix_init(&incmat, vcount, ecount);
for (i=0; i < ecount; ++i) {
/* we increment by one instead of set to 1 to handle self-loops */
MATRIX(incmat, IGRAPH_FROM(&graph, i), i) += 1;
MATRIX(incmat, IGRAPH_TO(&graph, i), i) += 1;
}
print_matrix(&incmat, stdout);
igraph_matrix_destroy(&incmat);
igraph_destroy(&graph);
return 0;
}