标签:
最近做图的题比较多,除了克鲁斯卡尔和floyd,像广搜,普里姆,Bellman-Ford,迪杰斯特拉,SPFA,拓扑排序等等,都用到图的邻接表形式。
数据结构书上表示邻接表比较复杂,一般形式如下:
1 typedef struct Node 2 { 3 int dest; //邻接边的弧头结点序号 4 int weight; //权值信息 5 struct Node *next; //指向下一条邻接边 6 }Edge; //单链表结点的结构体 7 8 typedef struct 9 { 10 DataType data; //结点的一些数据,比如名字 11 int sorce; //邻接边的弧尾结点序号 12 Edge *adj; //邻接边头指针 13 }AdjHeight; //数组的数据元素类型的结构体 14 15 typedef struct 16 { 17 AdjHeight a[MaxVertices]; //邻接表数组 18 int numOfVerts; //结点个数 19 int numOfEdges; //边个数 20 }AdjGraph; //邻接表结构体
其实有种简洁且高效的表示形式:
上面这段代码中,边的结构体Edge由三个元素组成:弧头结点序号,边权值,下一条边的序号。e[i]指的是第i条边。pre[i]记录的是从当前输入的情况来看,序号为i的弧尾结点发出的第一条边的序号是pre[i]。
这样,在操作某个结点发出的边时,可以像这么做:
其实,对于哈希表这类的存储结构(链表法解决冲突),与图的邻接表类似,也可以用类似的表示方法:
标签:
原文地址:http://www.cnblogs.com/usedrosee/p/4185830.html