图的前插表示法(基于数组实现)

一般的表示方法

  1. 矩阵表示法:将所有点对的关系存储到一个矩阵中,如果树有 N 个点,那么需要开辟NN大小的矩阵
  2. 基于地址(或者vector容器)的链表法:将与点 A 有关的边存储到A的链表。一般选择这种方法,但是该方法需要不断的重新开辟新空间。随着图的节点增加时,需要为新节点创建空间,并添加到对应的链表中。

在需要重复构建不同的图的问题中,上面两种传统的方法,或者(图的数据结构)显得效率不高。分析原因:第一种方法开辟了许多空间,但是利用率低;方法二随着图的改变而增减空间,但是在任何语言中,空间的开辟和释放都是需要时间的,因此,如果你需要重复构建图,且图的规模具有上限,那么可以考虑本文的方法,如下。

基于数组的前插表示法

一般地,下面的图都是有向图,因为无向图可以当做有向图。

根据图的节点数上限开辟足够的空间,存储以下信息:
1. Arry:head[u]
head 存储与节点 u 相关联的边序号集合中的某一个。ps:通过head[u]的边序号,可以找到下一个与 u 相关联的边。
2.Egde结构体(struct)

struct Edge{
int v;    //(u,v)边终点
int w;    //(u,v)边的权值
int next; //与u相关的下一边(非边(u,v))
}

3. Arryedges[id]
id 表示边的序号,将图的所有边都按照 Edge 结构体存到这个数组中

下面用代码说话:

/*基于前插表法的图(graph)结构,所有边都是有向的*/ 
//记录与节点相关的边编号
int head[MAX_N];
//边结构:指向点序号,权值,下一条边序号
struct Edge{
    int v;
    int w;
    int next;
}edge[2*MAX_N];
//插入新边(u->v)到u的链表(用数组表示链表)
void addEdge(int u, int v, int w, int id){
    edge[id].v = v;
    edge[id].w = w;
    edge[id].next = head[u];
    head[u] = id;
    return;
}

void buildTree(int N){
    int u, v, w;
    for(int i = 0; i < N-1; ++i){
        scanf("%d%d%d", &u, &v, &w);
        addEdge(u, v, w, i);
        addEdge(v, u, w, i+N-1);
    }
    return;
}

练习题目:
http://blog.csdn.net/u010232171/article/details/49703557

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值