图的存储方式

昨天 听caicai讲了几种关于图的存储方式 又学了好多  家有caicai 如有一宝 -> 转自 晓爷

下面 我所讲的 都是基于 有向图的建图方式

i:

map[a][b] ---最基础的邻接矩阵  直接用二维数组

ii:

 1 struct graph
2 {
3 int num; // ---指向 下一个顶点 ( 表示当前已经与 该顶点相邻的个数 )
4 int next[x]; // -- 与 该顶点 第( x+1 )个相邻的点的标号
5 int dist[x]; // -- 与 该顶点 第 ( x+1 )个相邻的点与该点之间的距离 --通过它来进行松弛操作
6
7 }mp[y]
8 bool vis[y] // -- 各个顶点 是否已经被访问过 在某个状态中 如 在spfa中 表示 是否已经入队
9 int dist[y] // -- 源点 -> 各个顶点的距离
10 // -- 这里的 next 和 dist 数组 是相对应的 所以 数组大小声明为相同
11 int main()
12 {
13 int temp;
14 scanf( "%d %d %d" , &from , &to , &dist );
15 temp = mp[from].num;
16 mp[from].next[temp] = to;
17 mp[from].dist[temp] = dist;
18 mp[from].num++;
19 // temp++ 这是 错的 千万不要犯这种错误
20 }
21
22 // 或者 可以用下面 这种方式 代码更加简洁 但可读性没有上面的好
23 mp[from].next[ mp[from].num ] = to;
24 mp[from].dist[ mp[from].num++ ] = dist;

iii:

 1 // y -- 顶点个数
2 // x -- 与 该顶点 相邻的顶点个数
3
4 struct graph
5 {
6 int num; // ---指向 下一个顶点 ( 表示当前已经与 该顶点相邻的个数 )
7 int next[x]; // -- 与 该顶点 第( x+1 )个相邻的点的标号
8 int dist[x]; // -- 与 该顶点 第 ( x+1 )个相邻的点与该点之间的距离 --通过它来进行松弛操作
9
10 }mp[y]
11 bool vis[y] // -- 各个顶点 是否已经被访问过 在某个状态中 如 在spfa中 表示 是否已经入队
12 int dist[y] // -- 源点 -> 各个顶点的距离
13 // -- 这里的 next 和 dist 数组 是相对应的 所以 数组大小声明为相同
14
15 iii:
16
17 // num --- 边的总数 每有一条边的加入 就+1
18 // x --- 顶点的个数
19 struct garph
20 {
21 int to; // 当结构体标号为num时 相邻的边的顶点
22 int dist; // 当结构体标号为num时 相邻的边的距离
23 int next; // 当结构体标号为num时 记录这条边的出发点的前面出现过的结构体标号,就是一个向前查询 类似于一个索引 很高效 通过是否为-1 来判断循环终止
24 }edge[x*3]; // 边的条数
25
26 int head[x]; // 指向有着相同源点的顶点的标号 head的下标 即当前边的顶点的下标
27
28 void addedge( int from , int to , int dist )
29 {
30 edge[num].to = to; //传递 相邻边的顶点
31 edge[num].dist = dist; //传递 距离
32 edge[num].next = head[from]; //通过head数组 来查询在前面的输入中 是否已经出现过相同的源点 如果有 就在此处指向它 方便后面的for遍历查询
33 head[from] = num; //使顶点标号为from的结点 指向 该结构体标号
34 num++;
35 }
36
37 int main()
38 {
39 memset( head , -1 , sizeof(head) ); // 因为我是从0~n 给顶点标号 那么 -1 是代表无前驱指向 当然 如果是从 1~n的 我当然可以初始化为0
40 scanf( "%d %d %d" , &from , &to , &dist )
41 addedge( from , to , dist );
42 for( int i = head[now] ; i!=-1 ; i = edge[i].next )//实现方式
43 }

iV:

上述的存储方式 都是放在二维数组 或者 结构体中 不具备灵活性 我们可以将它放在 容器 vector中 当然 这样可以节省内存
同时我们也要也牺牲时间的代价来获得  用何种方式 还得看具体 情况
通过vector<class>vec[num] 
来操作
class---> 基本数据类型 或 自定义数据类型

这里 还有一篇 讲的比我更为透彻 超神 -> click it

如果 有任何不对的地方 请给我指出来  为了不误导后面的无意看到此文的人

图的存储方式,码迷,mamicode.com

时间: 2024-12-27 02:02:58

图的存储方式的相关文章

图数据存储初见

在<图数据挖掘——基本概念>一文中详细的讲了图数据的基本概念,并在<图数据挖掘之图信息获取及存储>一文中描述了图的信息获取,但并没有对图数据的存储进行详细的介绍,该篇将就图数据存储给大家介绍一下,如有不对之处希望多多指出! 我们都知道图数据主要的信息是节点.边和权重,如何存储这些信息是至关重要的,同时采用何种存储结构对图的还原影响非常大.今天将介绍两种图的存储方式:1)关系数据库存储 2)关系数据库+文本. 1)关系数据库存储 如上面的图,我们知道其中有V1.V2.V3. V4.

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

图的五种种存储方式【图论】

运用三种方式来实现图的存储,以适应不同的情况. 参考:ACM-ICPC程序设计系列--图论及应用 方式1:邻接矩阵 邻接矩阵是表示图的数据结构中最简单也是最常用的一种. 实现:二维数组Map[MAXN][MAXN],Map[i][j]表示点i到点j的距离. 初始化:Map[i][i] = 0,Map[i][j] = INF(i!=j),读入数据Map[i][j] = w. 时间复杂度:初始化O(n^2),建图需要O(m),总时间复杂度O(n^2). 优缺点:简单直观,可直接查询点i和点j之间是否

图的邻接表存储方式的建立

图的邻接表存储方式,主要由表节点与头结点组成. 头结点中主要包含两个域: 1)存放顶点信息 2)存放与顶点相连的第一个表节点的指针 表节点中主要包含两个域: 1)存放相连的节点的序号 2)指向下一个节点的指针 #define MAXNUM 100; //表节点 typedef struct ArcNode{ int adjvex;//邻接顶点编号 struct ArcNode *next;//下一邻接顶点 }ArcNode; //头结点 typedef struct AdjList{ char

浮点型数据存储方式

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign)

c++成员函数的存储方式---11

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 成员函数属于一个类的成员,出现再类体中.可以被指定为公有,私有或受保护的. 1.在类外面定义成员函数时,需要用类名加作用域限定符(::),如下代码: #include <iostream> #include <string> using namespace std; class _test_myclass { public: void display(const int &val

数据结构的几种存储方式

              数据的存储结构是数据结构的一个重要内容.在计算机中,数据的存储结构可以采取如下四中方法来表现. 1)           顺序存储方式 简单的说,顺序存储方式就是在一块连续的存储区域 一个接着一个的存放数据.顺序存储方式把逻辑上相连的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接挂安息来体现.顺序存储方式也称为顺序存储结构(sequentialstorage structure),一般采用数组或者结构数组来描述.               线

float浮点数的二进制存储方式及转换

int和float都是4字节32位表示形式.为什么float的范围大于int? float精度为6-7位.1.66*10^10的数字结果并不是166 0000 0000 指数越大,误差越大. 这些问题,都是浮点数的存储方式造成的. float和double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):

探究InnoDB数据页内部行的存储方式

*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body .anchor { position: absolute; top: 0; bottom: 0; left: 0; display: block; padding-right: 6px; padding-left: 30px; margin-left: -30