2013-03-27 4 views
5

Задача: Я хочу сделать взвешенный неориентированный граф из матрицы смежности, хранящейся в файле .csv, используя igraph, а затем выполнить минимальное остовное дерево и некоторые другие алгоритмы на нем ,Создание взвешенного неориентированного графа в «igraph» в C/C++

Я начал с создания ориентированного графа с 10 вершинами и 5 ребрами. По умолчанию igraph не допускает веса для ребер, и вы должны использовать некоторые атрибуты, которые не имеют для меня смысла (что-то вроде igraph_i_set_attribute_table) в документации.

Может кто-то, пожалуйста, помогите мне в этом.

void print_vector(igraph_vector_t *v, FILE *f) { 
    long int i; 
    for (i=0; i<igraph_vector_size(v); i++) { 
    fprintf(f, " %li", (long int) VECTOR(*v)[i]); 
    } 
    fprintf(f, "\n"); 
} 

int main(int argc, char* argv[]) 
{ 
    igraph_t g; 
    igraph_vector_t v; 
    int ret; 
    igraph_es_t es; 

    /* Initialize the vector for edges */ 
    igraph_vector_init(&v,10); 

    VECTOR(v)[0]=0;VECTOR(v)[1]=1; 
    VECTOR(v)[2]=1;VECTOR(v)[3]=3; 
    VECTOR(v)[4]=1;VECTOR(v)[5]=5; 
    VECTOR(v)[6]=2;VECTOR(v)[7]=3; 
    VECTOR(v)[8]=2;VECTOR(v)[9]=5; 

    igraph_create(&g,&v,0,IGRAPH_DIRECTED); 

    print_vector(&v,stdout); 

    /* igraph_i_set_attribute_table(&igraph_cattribute_table); */ 

    igraph_vector_destroy(&v); 
    igraph_destroy(&g); 

    return 0; 
} 

ответ

3

Прежде всего, в общем, вы гораздо лучше использовать igraph из R или Python, атрибуты много-много лучше поддерживается. Например, вы можете легко выбрать вершины или ребра на основе значений атрибутов и т. Д. В C поддержка атрибутов минимальна, и вы в основном сами по себе, когда дело доходит до их работы. Итак, если вам действительно не нужен C, я бы предложил использовать R или Python.

Если вы все еще хотите C, то первое, что нужно иметь в виду, что вам необходимо включить

igraph_i_set_attribute_table(&igraph_cattribute_table); 

в вашем коде, прежде чем делать что-либо с атрибутом явно или неявно. То есть. даже если вы явно не манипулируете атрибутами, но создайте граф, который может иметь некоторые атрибуты, например. прочитайте графический файл GraphML, вам нужен этот вызов раньше, иначе атрибуты будут удалены. Лучше всего включить вызов в начале вашей функции main().

Неправда, что вы должны использовать любые атрибуты, я не уверен, что вы подразумеваете под этим.

Что касается установки и запроса атрибуты, просматривать файлы в каталоге examples/simple:

https://github.com/igraph/igraph/blob/master/examples/simple/cattributes.c https://github.com/igraph/igraph/blob/master/examples/simple/cattributes2.c https://github.com/igraph/igraph/blob/master/examples/simple/cattributes3.c https://github.com/igraph/igraph/blob/master/examples/simple/cattributes4.c

Эти примеры в основном искусственно, потому что они в основном используются для целей тестирования, но они показывают основное использование.

+0

Это было очень полезно @Gabor. Большое спасибо. – NightFox