链式向前星(一个优秀的存储图的数据结构)
在学习图的存储的时候,我们通常会有邻接矩阵和邻接表两种选择,邻接矩阵好写但效率低,邻接表不好写写但效率高,这里有一种优秀的数据结构,那便是用静态链表头插法实现的链式向前星。
先给出一下邻接矩阵
可以看出有向图中有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:目前在校大二学生 在准备区域赛 有想一起交流学习的可以互关 有错误请指出!
链式向前星(一个优秀的存储图的数据结构)相关推荐
- DijKstra算法普通+堆优化链式向前星
朴素版本 #include<bits/stdc++.h> using namespace std; const int maxn = 10010; const int inf = 0x3f ...
- 迪杰斯特拉--链式向前星
//算法-迪杰斯特拉 -链式向前星存边实现,加上优先队列 #include <iostream> #include <algorithm> #include <queue ...
- codeforces div3 D Circular Dance (链式向前星)
题目链接: http://codeforces.com/contest/1095/problem/D 通过题意可知,每次输入的两个数一定相邻,所有只要对每次输入的两个数看作是边,通过向前星构建无向图, ...
- 图论 --- spfa + 链式向前星 (模板题) dlut 1218 : 奇奇与变形金刚
1218: 奇奇与变形金刚 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 130 Solved: 37 [Submit][Status][Web B ...
- 胶带机 高速分散机设计 轴流风机 带式运输机的驱动装置图 选粉机 焊缝机三维图 链式输送机结构图 喷漆室双链机图 焊接变位机…设计
3×400胶带机 高速分散机设计 轴流风机图 带式运输机的驱动装置图 皮带机防尘罩 CPG500型高速铁路长轨铺轨机组液压原理图 整套机柜cad图纸--生产专用 热回流提取浓缩机组组装图 钢包烘烤装置 ...
- 数据结构(二)----线性表(List)链式存储结构(1)
线性表List---链式存储结构 相关概念 链式存储结构/链式表 定义 链式存储特点 单链表 单链表读取 单链表插入 单链表删除 时间复杂度 单链表整表创建 单链表整表删除 顺序存储与链式存储差异 P ...
- 【数据结构】链式队列的实现(C语言)
队列的链式存储称为链式队列.链式队列就是一个特殊的单链表,对于这种特殊的单链表,它的插入和删除操作规定在单链表的不同端进行.链式队列的队首和队尾指针分别用front和rear表示. 链式队列要掌握以下 ...
- c语言建立队列(顺序队列、循化队列和链式队列)
c语言建立队列 一.顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二.如何解决"假上 ...
- 顺序二叉树(堆)与链式二叉树的C语言实现
文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 树在实际中的运用 二叉树的概念及结构 二叉树的概念 现实中的二叉树 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序结构及实现 二 ...
最新文章
- Freebsd10上部署open*** 服务器
- 皮一皮:看看地铁有多挤...
- 菜鸟网络 | 寄件业务的产品逻辑
- Hibernate——Query查询
- 使用python画图表_利用Python绘制数据的瀑布图的教程
- 05.analysis-normalizer应用
- HDU 4857 逃生(拓扑排序)
- 信息学奥赛一本通(1320:【例6.2】均分纸牌(Noip2002))
- 二叉树的建立与遍历(数据结构)
- in-list iterator
- Hive分区(静态分区+动态分区)
- HDOJ-1875-畅通工程再续 解题报告
- (人脸)目标检测指标-FDDB
- [图形学]ASTC纹理压缩格式
- 职场Word使用技巧大全,教你成为职场高手!
- luogu 2411 白银莲花池 luogu 1606 Lilypad Pond
- PMSG永磁同步发电机并网仿真模型
- 1:使用递归函数计算1到n之和
- 1800元龙芯笔记本试用报告 仅是PIII水平?
- 阿里云肖力:云即信任