在学习图的存储的时候,我们通常会有邻接矩阵和邻接表两种选择,邻接矩阵好写但效率低,邻接表不好写写但效率高,这里有一种优秀的数据结构,那便是用静态链表头插法实现的链式向前星

先给出一下邻接矩阵

可以看出有向图中有4个顶点4条边
1 —> 2
1 —> 3
2 —> 4
3 —> 1

那么用链式向前星该怎么存呢?

字丑的见不得人啦,对于每个顶点u,我们都会有h[u]代表其指向的第一个边的idx,然后e[idx]是指边v,w[idx]指边u-v的权重,ne[idx]是指链上的下一条边,当ne[i] = -1时表示链完
对于上面的图
h[1] = 1, e[1] = 3, ne[1] = 0, e[0] = 2, ne[0] = -1;
h[2] = 2, e[2] = 4, ne[2] = -1;
h[3] = 3, e[3] = 1, ne[3] = -1;
h[4] = -1;

刚开始我也觉得难理解,但是敲代加画图加脑海模拟便会了,这个是头插法的静态链表,顶点u指向的多个顶点v都在链表中,而链表头就是h[u]; 当h[u] == -1 || ne[idx] == -1就表示链表到空了,看看代码

定义


// N 表顶点个数 M 表边个数 视题目而定
const int N = 1010, M = 1e4 + 10; //这是有向边
//e[idx]存的是u指向的顶点v, w[idx]存的是 u - v之间的权重
//ne[idx] 存的是下一顶点所在的下标 h[u] 就是头结点 idx是游标
int e[M], w[M], ne[M], h[N], idx;//无向边是特殊的有向边 开双倍
//int e[M<<1], w[M<<1], ne[M<<1], h[N], idx;

初始化

void init()  //初始化
{idx = 0;                  //游标从零开始 memset(h, -1, sizeof h);   //将所有头结点置空
}

加边操作

void init()  //初始化
{idx = 0;                  //游标从零开始 memset(h, -1, sizeof h);   //将所有头结点置空
}

总揽

#include <iostream>
#include <cstring>
using namespace std;// N 表顶点个数 M 表边个数 视题目而定
const int N = 1010, M = 1e4 + 10; //这是有向边
//e[idx]存的是u指向的顶点v, w[idx]存的是 u - v之间的权重
//ne[idx] 存的是下一顶点所在的下标 h[u] 就是头结点 idx是游标
int e[M], w[M], ne[M], h[N], idx;//无向边是特殊的有向边 开双倍
//int e[M<<1], w[M<<1], ne[M<<1], h[N], idx;void init()   //初始化
{idx = 0;                  //游标从零开始 memset(h, -1, sizeof h);   //将所有头结点置空
} void add(int a, int b, int c) //加边操作
{e[idx] = b;       //存顶点值w[idx] = c;  //存边权 ne[idx] = h[a];  //存h[a]指向的前驱顶点的下标 h[a] = idx++;  //h[a]指向b所在下标, idx游标往后移动
} int main()
{int n, m; //顶点数(1~n)和权值 cin >> n >> m;init();  //别忘初始化 while(m--){int a, b, c;cin >> a >> b >> c;add(a, b, c);   //加边 }for(int i = 1;  i <= n; ++i)   //一个一个顶点遍历 {for(int j = h[i]; j != -1; j = ne[j])    //遍历顶点指向的边 cout << e[j] << "(" << w[j] << ")     ";cout << "\n\n";}return 0;
}

遍历结果如下:

>Tips:目前在校大二学生 在准备区域赛 有想一起交流学习的可以互关 有错误请指出!

链式向前星(一个优秀的存储图的数据结构)相关推荐

  1. DijKstra算法普通+堆优化链式向前星

    朴素版本 #include<bits/stdc++.h> using namespace std; const int maxn = 10010; const int inf = 0x3f ...

  2. 迪杰斯特拉--链式向前星

    //算法-迪杰斯特拉 -链式向前星存边实现,加上优先队列 #include <iostream> #include <algorithm> #include <queue ...

  3. codeforces div3 D Circular Dance (链式向前星)

    题目链接: http://codeforces.com/contest/1095/problem/D 通过题意可知,每次输入的两个数一定相邻,所有只要对每次输入的两个数看作是边,通过向前星构建无向图, ...

  4. 图论 --- spfa + 链式向前星 (模板题) dlut 1218 : 奇奇与变形金刚

    1218: 奇奇与变形金刚 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 130  Solved: 37 [Submit][Status][Web B ...

  5. 胶带机 高速分散机设计 轴流风机 带式运输机的驱动装置图 选粉机 焊缝机三维图 链式输送机结构图 喷漆室双链机图 焊接变位机…设计

    3×400胶带机 高速分散机设计 轴流风机图 带式运输机的驱动装置图 皮带机防尘罩 CPG500型高速铁路长轨铺轨机组液压原理图 整套机柜cad图纸--生产专用 热回流提取浓缩机组组装图 钢包烘烤装置 ...

  6. 数据结构(二)----线性表(List)链式存储结构(1)

    线性表List---链式存储结构 相关概念 链式存储结构/链式表 定义 链式存储特点 单链表 单链表读取 单链表插入 单链表删除 时间复杂度 单链表整表创建 单链表整表删除 顺序存储与链式存储差异 P ...

  7. 【数据结构】链式队列的实现(C语言)

    队列的链式存储称为链式队列.链式队列就是一个特殊的单链表,对于这种特殊的单链表,它的插入和删除操作规定在单链表的不同端进行.链式队列的队首和队尾指针分别用front和rear表示. 链式队列要掌握以下 ...

  8. c语言建立队列(顺序队列、循化队列和链式队列)

    c语言建立队列 一.顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二.如何解决"假上 ...

  9. 顺序二叉树(堆)与链式二叉树的C语言实现

    文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 树在实际中的运用 二叉树的概念及结构 二叉树的概念 现实中的二叉树 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序结构及实现 二 ...

最新文章

  1. Freebsd10上部署open*** 服务器
  2. 皮一皮:看看地铁有多挤...
  3. 菜鸟网络 | 寄件业务的产品逻辑
  4. Hibernate——Query查询
  5. 使用python画图表_利用Python绘制数据的瀑布图的教程
  6. 05.analysis-normalizer应用
  7. HDU 4857 逃生(拓扑排序)
  8. 信息学奥赛一本通(1320:【例6.2】均分纸牌(Noip2002))
  9. 二叉树的建立与遍历(数据结构)
  10. in-list iterator
  11. Hive分区(静态分区+动态分区)
  12. HDOJ-1875-畅通工程再续 解题报告
  13. (人脸)目标检测指标-FDDB
  14. [图形学]ASTC纹理压缩格式
  15. 职场Word使用技巧大全,教你成为职场高手!
  16. luogu 2411 白银莲花池 luogu 1606 Lilypad Pond
  17. PMSG永磁同步发电机并网仿真模型
  18. 1:使用递归函数计算1到n之和
  19. 1800元龙芯笔记本试用报告 仅是PIII水平?
  20. 阿里云肖力:云即信任

热门文章

  1. 每日小记2017.3.7
  2. Azkaban 进程和任务监控(任务状态从MySQL同步到SqlServer)
  3. python qtextedit设置光标位置_Python基础命令学习——就这一篇文章就够了
  4. 局域网弱口令扫描工具_漏洞扫描软件AWVS的介绍和使用
  5. UE3 基本的分析及优化技术
  6. js整理 03-18
  7. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析
  8. android smartbar适配
  9. 第10 章继承映射(InheritanceMappings)
  10. libevent备忘