2016-03-30 15 views
0

CのiGraphライブラリを使用してグラフ内の最大次数のランダムに選択された頂点を削除したいと思います。ここに私のコードだ:CのiGraphグラフの最大次数の頂点を削除

#include <stdio.h> 
#include <igraph/igraph.h> 

int main() { 

    float dens = .12; 
    int nbr_nodes = 100; 
    igraph_integer_t mdeg; 
    igraph_vector_t degree; 
    igraph_t g; 

    igraph_rng_seed(igraph_rng_default(), 400); 
    igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, nbr_nodes, dens,IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS); 

    igraph_vector_init(&degree,0); 
    igraph_degree(&g, &degree, igraph_vss_all(), IGRAPH_ALL, IGRAPH_NO_LOOPS); 

    igraph_maxdegree(&g, &mdeg, igraph_vss_all(), IGRAPH_ALL, IGRAPH_NO_LOOPS); 

    igraph_delete_vertices(&g, ???); 

    return 0; 
} 

私は最大の学位を見つけることができます:

igraph_maxdegree(&g, &mdeg, igraph_vss_all(), IGRAPH_ALL, IGRAPH_NO_LOOPS); 

しかし、私は最高度の頂点の1つに対応するIDを見つけるするかどうかはわかりません。

要するに、私は何の代わりに何を入れるべきか分からないin:

igraph_delete_vertices(&g, ???); 

ありがとうございました!どんな手がかりもありがとう!

答えて

1

度数が最大次数に等しい複数の頂点がある可能性があるので、すべての度数をigraph_degree()(これと同じように)でクエリし、取得した最大値に等しい項目をベクトル内で見つけなければなりません先にigraph_maxdegree()からこれらの項目のインデックスをベクトルに収集し、igraph_delete_vertices()に渡してigraph_vs_tにラップします。次のようなもの:

igraph_vector_t indices; 
long int i; 
igraph_integer_t vcount = igraph_vcount(&graph); 

igraph_vector_init(&indices, 0); 
for (i = 0; i < vcount; i++) { 
    if (VECTOR(degree)[i] == mdeg) { 
     igraph_vector_push_back(&indices, i); 
    } 
} 

igraph_delete_vertices(&g, igraph_vss_vector(&indices)); 
+0

これは素晴らしいです!私は私の質問ではっきりしていたはずです。私は実際には、ランダムに選択された最高度の頂点のうちの1つだけを削除する必要があります(または順序付けられた度数ベクトルの最初のもの)... – Rodolphe

関連する問題