存储图的信息基本有3种方法
1:邻接矩阵
使用一个n*n的二维数组,a[i][j]表示结点i到结点j之间存在一条边。临街矩阵既可以存储有向图,也可存储无向图,既可以只是单纯的表示两个结点之间是否连通,也可以表示含有权值的图。无向图存储的只是需要记住a[i][j]=a[j][i]就可以了
优点:便于理解,便于书写代码
缺点:空间、时间复杂度比较高,一般适用于稠密图
2:邻接表
为图的每一个结点建立一个链表,链表中的值表示与这个结点相连的节点的信息。
优点:便于理解,时间空间复杂度较低
缺点:写一个单纯的链表,设计指针,容易写错
所以邻接表的思想一般使用vector可变数组来实现
3:链式前向星
其实也是一个邻接表的表示方法,不过时间和控件复杂度会稍微好点
int head[N],cnt=0; struct edge{ int from,to,next,dis; }edge[N]; void addedge(int u,int v,int w){ cnt++; edge[cnt].from=u;//表明这条边的来向 edge[cnt].to=v;//表明这条边的去向 edge[cnt].next=head[u];//表明这条边的下一条边(都是与u相连的边) head[u]=cnt;//改变u结点的第一个边 //相当于原先是head[u]->v1,现在插入一条(u,v2)的边,变为head[u]->v2->v1 }
写于2020/8/8 23:23
原文:https://www.cnblogs.com/sunjianzhao/p/13461011.html