再谈图的存储方式(邻接矩阵,邻接表,前向星)
来源:互联网 发布:淘宝倒卖赌博游戏币 编辑:程序博客网 时间:2024/06/03 09:16
1.邻接矩阵
1.存图思想
使用一个矩阵来描述一个图,对于矩阵的第i行第j列的值,表示编号为i的顶点到编号为j的顶点的权值。
2.代码实现
// 最大顶点数const int V = 1000;// 邻接矩阵的定义// mat[i][j] 表示 顶点'i'到顶点'j'的权值int mat[V][V];// 邻接矩阵的初始化操作// 假设权值为零表示没有该边memset(mat, 0, sizeof(mat))// 增加边// 新增顶点'i'到顶点'j'的边,权值为wmat[i][j] = w;//遍历邻接边for(int i=0;i<n;i++){ for(int j=0;j<n;j++) { if(mat[i][j]!=0) //doing something. }}
2.邻接表
1.存图思想
邻接矩阵对于每个顶点使用定长的数组来存储以该点出发的边的情况。第i个数组的第j个值存储的是从顶点i到顶点j的边的权值。
而邻接表则是对于每个顶点使用不定长的链表来存储以该点出发的边的情况。因此对于第i个链表的第j个值实际上存储的是从编号为i的顶点出发的第j条边的情况。
2.代码实现
在ACM题目中,动态的数据结构一般是不被推荐的,因为动态开辟内存比较消耗时间,且写起来复杂容易出错。
大部分情况我们使用C++STL里的vector作为链表来实现图的邻接表。
大部分情况我们使用C++STL里的vector作为链表来实现图的邻接表。
// 最大顶点数const int V = 100000;// vector实现的邻接表的定义// 不考虑边权,存储类型为int型vector<int> e[V];// 若考虑边权,则定义一个结构,vector也为结构体类型struct node{int v,int w};//存储边的终点和边的权值vector<node> e[V];//也可以用一个数组或vector单独存边的信息,然后在邻接表vector中记录每个点邻接边的编号// 邻接表的初始化操作for(int i=0;i<n;i++){ e[i].clear();}// 增加边//不考虑边权e[i].push_back(j);//考虑边权e[i].push_back(node(j,w));//遍历邻接边for (int j=0; j<(int)e[i].size(); ++j) { int k=e[i][j];//第j条边为[i,k] //or node &e=e[i][j];//第j条边为[i,e.v,e.w] // do something.}
3.前向星
1.存图思想
前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.
用len[i]来记录所有以i为起点的边在数组中的存储长度.//不用len数组也可以
用head[i]记录以i为边集在数组中的第一个存储位置.
用len[i]来记录所有以i为起点的边在数组中的存储长度.//不用len数组也可以
用head[i]记录以i为边集在数组中的第一个存储位置.
2.代码实现
一般不用不写了。。。
4.链式前向星
1.存图思想
我们建立边结构体为:
struct Edge{ int next; int to; int w;};其中edge[i].to表示第i条边的终点,edge[i].next表示与第i条边同起点的下一条边的存储位置,edge[i].w为边权值.
另外还有一个数组head[],它是用来表示以i为起点的第一条边存储的位置,实际上你会发现这里的第一条边存储的位置其实是在以i为起点的所有边的最后输入的那个编号.head[]数组一般初始化为-1。
2.代码实现
// 最大顶点数const int V = 1000;const int E = 10000;struct Edge{ int next; int to; int w;};Edge edge[E];int head[V];//初始化memset(head,0xff,sizeof(head));memset(edge,0,sizeof(edge));//增加边void add(int u,int v,int w) { //cnt为边计数 edge[cnt].w = w; edge[cnt].to = v; edge[cnt].next = head[u]; head[u] = cnt++; } //遍历边for(int i=1;i<=n;i++){ for(int k=head[i];k!=-1;k=edge[k].next) { //doing something. }}
相关资料:
1.链式前向星及其简单应用 | Malash's Blog
2.前向星与链式前向星 | 学步园3.ACM图论之存图方式 | 剑紫青天
0 0
- 再谈图的存储方式(邻接矩阵,邻接表,前向星)
- 数据结构(14):图的存储方式(邻接矩阵、邻接表....)
- 图的存储方式:邻接矩阵和邻接表【基础】
- 关于图的存储方法 (静态邻接表、前向星、边集数组)
- 【图论】数组模拟邻接表存储(链式前向星)
- 算法导论--图的存储(邻接表与邻接矩阵)
- 图的邻接矩阵和邻接表存储
- 图的表示方式----邻接矩阵、邻接表
- 图的存储结构-邻接表-边集数组-前向星
- 图的存储结构(邻接矩阵、边数组、邻接表、十字链表、邻接多重表)
- 图的邻接矩阵与邻接表存储方式及优缺点对比
- 前向星存储方式
- 无向图的表示:邻接矩阵和邻接表
- Dijistra求最短路(邻接表存储,前向星存储,堆优化)
- 图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)
- 【链式前向星】(静态建邻接表)
- 链式前向星(数组模拟邻接表)
- 邻接表与链式前向星
- 图片加载
- HDU 1754 I Hate It【线段树入门题,单点替换,区间最值】
- mpi学习日志(9):mpi4py与Split
- Markdown语法的简要规则(for Atom)
- java之学习路线
- 再谈图的存储方式(邻接矩阵,邻接表,前向星)
- Milk<hdoj1070>
- 惯性传感器的另(qí)类(pā)应用
- 编写一个函数,将两个字符串连接起来。(不能用strcat函数)。
- UVA - 10014 Simple calculations
- 有上下界的流
- java-jni-02-Design-Overview
- centos 7 下的python psutil模块
- 剑指offer——按之字形顺序打印二叉树