邻接表的数组实现

int n,m;
int first[maxn];
int u[maxn],v[maxn],w[maxn],next[maxn];
void read_graph()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)first[i]=-1;
    for(int e=0;e<m;e++){
      scanf("%d%d%d",&u[e],&v[e],&w[e]);
      next[e]=first[u[e]];
      first[u[e]]=e;
    }
}

  打上来慢慢理解。

时间: 2024-10-16 01:15:33

邻接表的数组实现的相关文章

巧妙的邻接表(数组实现)

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M.对于稀疏图来说,M要远远小于N2.先上数据,如下. 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m.n表示顶点个数(顶点编号为1~n),m表示边的条数.接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z.下图就是一种使用链表来实现邻接表的方法. 上面这种实现方法为图中的每一个顶点(左边部分)都建立了

算法8:巧妙的邻接表(数组实现)

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,如今我来介绍第二种存储图的方法:邻接表,这样空间和时间复杂度就都是M. 对于稀疏图来说,M要远远小于N2. 先上数据.例如以下. 1 2 3 4 5 6 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m. n表示顶点个数(顶点编号为1~n),m表示边的条数.接下来m行表示,每行有3个数x y z.表示顶点x到顶点y的边的权值为z.下图就是一种使用链表来实现邻接表的方法. 上面这样的实现方法为图

邻接表(数组实现)

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M.对于稀疏图来说,M要远远小于N2.先上数据,如下. 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m.n表示顶点个数(顶点编号为1~n),m表示边的条数.接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z.下图就是一种使用链表来实现邻接表的方法. 上面这种实现方法为图中的每一个顶点(左边部分)都建立了

图论之邻接表的数组实现

虽然邻接矩阵真的很方便,很简单,很利于理解,但却有着一些重大缺陷: 当我们遇到的是一张稀疏图的时候,邻接矩阵就造成严重的空间浪费,更直接一点,就是根本存不下来: 这个时候就不得不考虑其他存图方式了,这个时候另一种流行的存图方式就登场了--邻接表,当然使用vector数组也是一种良好的选择: 邻接表的实现可以通过链表或数组的方式实现,我这里主要讲数组的实现方法: 首先,有三个数组,分别为u[max],v[max],w[max]分别代表着每条边的起点,终点,权重,而下标则代表着边的编号: 然后设立f

【数据结构】邻接表的广度与深度遍历

邻接表:数组和链表相结合的方法.图中顶点一般用一个一维数组存储,也可以用单链表存储,每个顶点的邻接点构成一个线性表,一般为单链表. 无向图: 有向图: 代码: #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #defi

图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)

图(Graph)是一种非线性结构 图的特点(多对多),顶点之间的关系是任意的,图中任意两个顶点之间都可能相关,顶点的前驱和后继个数无限制. 图:数据元素间存在多对多关系的数据结构,加上一组基本操作构成的抽象数据类型. 图的基本术语 顶点:图中的数据元素. 弧:若 <v, w>∈VR,则 <v, w> 表示从 v 到 w 的一条弧,且称 v 为弧尾,称 w 为弧头,此时的图称为有向图. G1 = (V1, A1)          V1 = {v1, v2, v3, v4} A1 =

数组模拟实现邻接表

图的边的表示方法,有很多.像邻接矩阵.边集数组.邻接表等.其中,第三者的时空复杂度应该是最优的.但是实现却需要比较麻烦的链表,但是我们也可以用数组来模拟链表,使编程的复杂度进一步降低. 这种算法:遍历所有的边的时间复杂度是O(M),M表示边的总数,空间复杂度也是O(M).在最坏情况下,查询i与j是否有边的时间复杂度是O(N). 这篇文章主要写给P(Pascal)党,在Cpp中,链表的实现方式较为简单(有现成的库),所以也没必要用这种办法.说是模拟实现邻接表,其实是模拟实现链表.接下来看类型定义:

邻接表

表示图的一种方法,用哈希链存储每一个顶点到其子节点的边信息.对于每一条边,我们存储两个顶点u,v及边的权值w. 拿图论基本图举例: 上图有11条边.我们从0开始为这些边标号: 先给出数组的存储方法(可能错误):用first[i]表示第编号为i的节点的第一个子节点的编号,这个子节点的选取是任意的.用next[i]表示编号为i的节点在这条哈希链中的下一个结点的编号. 对于节点3,一共有3个子节点:2,4,5,比如我们让first[3]=2.那么我们这么组织这条链: 用一个for遍历这条链:for(i

最短路径(四)—Bellman-Ford的队列优化(邻接表)

上一节我们写了Bellman-Ford算法解决负权边的问题: 邻接表存储图: n个顶点,m条边. 数组实现邻接表.对每一条边进行1-m编号.用u,v,w三个数组来记录每条边的信息,即u[i],v[i],w[i]表示第i条边是从第 u[i]号顶点到v[i]号顶点且权值为w[i]. first数组的1-n号单元格分别用来存储1-n号顶点的第一条边的编号,初始的时候因为没有边加入所有都是-1.即first[u[i]]保存顶点u[i]的第一条边的编号,next[i]存储"编号为i的边"的&qu