邻接表理解

http://developer.51cto.com/art/201404/435072.htm

这篇文章讲邻接表讲的很好。记录一下自己的理解。

邻接表用的是链式存储结构,根据图很好理解,但是一看代码就懵了。拿原文提到的一个数据举例:

4 5

1 4 9

4 3 8

1 2 5

2 4 6

1 3 7

四个顶点5条边,自然可以先拿u[],v[],w[]数组记录每条边,因为要用数组模拟链表,所以想到可以开两个数组first[],next[](初始化都为-1),first[]存的是以顶点为起始点的最后一条边。比如first[1]=5,因为顶点1最后在第5条边且为初始点。那么前面还有1的边怎么办呢?就用next[]数组记录这个点所在的上一条边,所以next[5]=3,next[3]=1,即顶点1最后在5号边,5号边上一个包含顶点1的边是3号边等等。。

大概写个代码:

 1 int maxn=100;
 2 int v[maxn],u[maxn],w[maxn],first[maxn],next[maxn];
 3 int n,m,a,b,c;
 4 cin>>n>>m;
 5 for(int i=1;i<=n;i++) first[i]=-1;
 6 for(int i=1,i<=m;i++){
 7     cin>>u[i]>>v[i]>>w[i];
 8     next[i]=first[u[i]];//i号边所在顶点的上一条边是first[u[i]]号边
 9     first[u[i]]=i;//以u[i]为起始顶点的最后一条边是i号边
10 }
时间: 2024-12-12 10:16:07

邻接表理解的相关文章

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

关于自动寻径和图、邻接表的学习和启发

以后的游戏中可能会用到人物的自动寻径,在网上看到一个非常不错的博文,特学习了一下,并转了过来为以后留着... 再次感谢 Siliphen的分享,本文转载自 http://blog.csdn.net/stevenkylelee/article/details/38408253 本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文的实现使用的环境是:Cocos2d-x 3.2,VS2013 本文,我们最终实现的地图行走效果如下2图:

&lt;图论入门&gt;邻接矩阵+邻接表

非本人允许请勿转载. 趁热打铁,学会了邻接表把这个总结一下,以及感谢大佬uncle-lu!!!(奶一波)祝早日进队! 首先,图论入门就得是非常基础的东西,先考虑怎么把这个图读进去. 给定一个无向图,如下 怎么把这个图的数据读入进去呢? 把这个图剖析开来看,1连着的是2和3,2连着4和5,3连着6和7,4连着5,5连着8和6,6连着9. 所以这个图可以用一种神奇的东西----邻接矩阵来存.如下,能联通的制为1,不能联通的制为0. 那么可以看出来,这个邻接矩阵光读入的时间复杂度就是O(N2)的了,在

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &

图的遍历(BFS、DFS的邻接矩阵和邻接表实现)

当年老师给我们讲这里的时候,讲的真是云里雾里的. .其实画个图就很容易理解的事情,为什么扯那么远 我觉得 DFS其实就是树的先序遍历的强化版本 BFS是层序遍历的强化 只不过 图的实现方式比较多元化 而且不像二叉树有明确的根 操作起来相对难一些 理论其实很好理解 就是具体操作起来 每次都很晕的样子 眼高手低了又. 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上.

图的邻接表存储c实现(DFS遍历)

先简要列出实现过程中所需要的数据结构. 如下图 对于这个图而言,它的邻接表可以这样表示,当然表现形式可以多样,这只是我随便画的一种表示方法. 顶点表                                          边表 我们把第一个表即上面标着fixedvex的这个表称作顶点表,后边的称为边表. 上图所示,边表的结构应该这样写: //定义一个边表节点的结构 typedef struct node{ int adjvex; //int Mark; //用于标记是否被访问过 nod

ACM1258邻接表

教训:使用邻接表的时候一定要把邻接表的结构组定义的足够大,不能仅仅等于节点的个数,因为线段的数量往往远超过节点的数量. 这个题目是拓扑排序练习,提高下理解. 1 #include<iostream> 2 using namespace std; 3 struct TOPO 4 { 5 int from,to,next; 6 }; 7 TOPO p[200001];//这里要定义的足够大才行 8 int head[200001];//它和上面的是同步的大小才好 9 int *in,*use; 1

邻接表 - 边表

我对边表的理解和边表的建立: //结构 struct node { int u,v,w; int next; }g[M]; int head[N],t = 0; //初始化 void init() { t = 0; memset(head,-1,sizeof(head)); } //加边 void add(int u,int v,int w) { g[t].u = u; g[t].v = v; g[t].w = w; g[t].next = head[u]; head[u] = t; t++;