C++使用igraph 3.2 创建你的第一个graph

       调用生成graph对象函数的叫做图表生成器,随机图表生成器被称为"games"。

       igraph既可以处理有向图也可以处理无向图,大多数的图表生成器可以生成上述的两种图表,当然多数其他的函数通常也能处理这两种图表。 计算出从一个顶点到另一个顶点

的最短路径函数igraph_shortest_paths()可以适用的不仅有有向图还有无向图。

       igraph拥可以以不同的复杂方式创建graph对象。最简单的graph对象,就像是星形图(igraph_star()),环形图(igraph_ring()),点阵图(igraph_lattice())或者是树形图       

igraph_tree()).

       接下来的代码创建了一个无向图圆形点阵图,并且给该图增加了一些随机的边,同时在增加随机边的前后计算出图中所有成对顶点之间最短路径的平均值。(该信息是再告诉我

们随机边能够大幅度的减少路径长度)

// igraphtest.cpp : Defines the entry point for the console application.
#include"stdafx.h"
#include 
  
  
   
   
#include "include\igraph.h"
#pragma comment(lib,"igraph.lib")
int main() 
{
	igraph_real_t avg_path;
	igraph_t graph;
	igraph_vector_t dimvector;
	igraph_vector_t edges;
	int i;
	igraph_vector_init(&dimvector,2);
	VECTOR(dimvector)[0]=30;
	VECTOR(dimvector)[1]=30;
	igraph_lattice(&graph,&dimvector,0,IGRAPH_UNDIRECTED,0,1);
	srand(100);
	igraph_vector_init(&edges,20);
	for(i=0;i<igraph_vector_size(&edges);i++)
	{
		VECTOR(edges)[i]=rand()%(int)igraph_vcount(&graph);
	}
	igraph_average_path_length(&graph,&avg_path,IGRAPH_UNDIRECTED,1);
	printf("Average path length(lattice):%f\n",(double)avg_path);
	igraph_add_edges(&graph,&edges,0);
	igraph_average_path_length(&graph,&avg_path,IGRAPH_UNDIRECTED,1);
	printf("Average path length (radomized lattice):%f\n",(double)avg_path);

	igraph_vector_destroy(&dimvector);
	igraph_vector_destroy(&edges);
	igraph_destroy(&graph);
	return 0;
}

  
  

       这个案例说明了几个新的知识点,igraph使用igraph_vector_t数据类型代替C元以内的数组,igraph_vector_t比一般的数组更为好用,igraph_vector_t的创建使用

igraph_vector_init函数。就像igraph需要被销毁一样,igraph_vector_t的销毁和回收内存使用igraph_vector_destroy函数。一个igraph_vector_t可以通过VECTOR宏函数编入 

索引,igraph_vector_t也可以被重新设置大小,等等。多数的igraph函数返回igraph_vector_t调整大小后的结果。

       igraph_lattice函数使用了一个igraph_vector_t参数,指定了表格的维数,在这个例子中,我们创建了一个30*30的二维表格,读者可以查看igraph_lattice()的相关文档,知 

晓其他参数的作用。

      图中的顶点被标记为一个从0到N-1的数字,N是图中的顶点数(这被包含在igraph_vcount(),就如同上述案例中)igraph_add_edges()函数只是简单的将一个图和一个顶点

数组再次绘制出一些新的边,第一条边是在顶点数组的前两个点之间绘制成的,第二条边是在第三个顶点和第四个点之间,以此类推。。。以这种方式我们向该图中增加了一些

随机的边。

       需要记录的是,在这个例子中,增加自环的边是可行的,也就是边的两端是同一个点,这样的边可以有多条,但不是在同一对顶点上绘制多条边,igraph_t当然可以指环,

或者是在同一对顶点上的多条边,虽然一些路径希望的是简单图。比如不带自环边和同一对顶点上的多条边。因为通常来说,一个图的结构化的属性是不明确的,尤其是一些非

简单图。自环边可以通过igraph_simplify()来去除!

igraph_average_path_length — 计算一个图中多条直径的平均值

int igraph_average_path_length(const igraph_t *graph, igraph_real_t *res,
			       igraph_bool_t directed, igraph_bool_t unconn);

Arguments: 

graph:

图对象

res:

保存返回结果的double型数据

directed:

布尔值,指明是否是有向图,默认是false

unconn:

在图不是一个单独的图的时候使用,true,返回子图中的直径的平均值,false返回不存在的测地线的长度使用的顶点数目

Returns: 

Error code: IGRAPH_ENOMEM,对于数据结构,内存告急


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值