一种经典的邻接表的实现和遍历方式
来源:互联网 发布:linux 文件写权限 编辑:程序博客网 时间:2024/06/09 21:45
邻接表不和邻接矩阵只和点有若干联系,它和点与边都有密切的联系。
邻接表的实现需要四个东西,一个是记录边信息的数组、一个是表头、一个是当前操作边的序号、一个是add函数。(当然也少不了初始化函数了)
具体如下。
int which=1;int head[maxv];struct EDGE{ int d,w,next; EDGE():next(-1){}}e[maxv];void add(int s, int d,int w){ e[which].d=d; e[which].w=w; e[which].next=head[s]; head[s]=which++;}void initforgraph(){ memset(head,-1,sizeof(head)); memset(e,0,sizeof(e));}
which表示当前操作的是哪一条边(是边的序号)(有些人喜欢用size、用n,其实都是习惯问题了。which到最后输入结束的时候也是边的数量)
head是表头,head【2】表示以2为起点的边的表。
e数组是记录边信息的,但是由于邻接表的特殊性,我们只需要记录他的终点、权值和下一条边的序号,而不是像克鲁斯卡尔算法中经典地储存起点、终点、权值这样子。
在插入边表的时候是前叉式,所以代码看上去好像是有点绕。
不了解前叉式建表的话建议先去看看链表的插入的几种方式。
这里注意下head一定要初始化为-1的。
不了解邻接表的话,也比较难看懂代码,建议学一下数据结构的图的相关知识。
当然这种实现方式不是使用教科书上的指针的实现方式,而是用数组模拟的。他们使用起来是一样的效果。
下面是遍历方式。
其实使用邻接表的图的遍历方式很像是BFS,由一个点发散的遍历他相邻的点(边)。
遍历方式是基于我上面给出的邻接表的实现方式的。
int main(){ initforgraph(); int t1,t2,t3; for(int i=1;i<=M;i++)//M is the number of edges. { scanf("%d%d%d",&t1,&t2,&t3);//start, end, weight. add(t1,t2,t3); } for(int i=1;i<=N;i++) { printf("起点是%d有\n",i); for(int j=head[i];j!=-1;j=e[j].next) { printf("编号为%d的边\n",j); } printf("\n"); }}
下面的第一重循环是对所有的点进行循环,第二重循环是对以这个点为起点的所有的边的循环。
阅读全文
0 0
- 一种经典的邻接表的实现和遍历方式
- 图的深度遍历和广度遍历(用邻接表的方式)
- 邻接表实现图的遍历
- 邻接表实现图的储存,遍历
- 邻接表的实现与深度遍历
- 邻接表 实现图的遍历 C++
- 图的邻接表和DFS遍历
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 邻接表-图的遍历-广度和深度优先遍历
- 图的遍历(BFS、DFS的邻接矩阵和邻接表实现)
- Java实现基于邻接表的图的深度和广度遍历
- 邻接表的图遍历
- 邻接表的dfs遍历
- 邻接表的bfs遍历
- 图的邻接表遍历
- 图的深度优先遍历DFS(分别以邻接矩阵和邻接表实现)
- 图的广度优先遍历BFS(分别以邻接矩阵和邻接链表实现)
- 建立图的邻接表储存并实现深度优先和广度优先遍历
- mount 挂载点
- oracle sql rollback savepoint
- Activity与Activity,Activity与Fragment及Fragment与Fragment之间传值
- win10+anaconda3+tensorflow-gpu一些报错的解决方法
- threadReentranLockAndCondition
- 一种经典的邻接表的实现和遍历方式
- linux基本命令及操作14(磁盘加密、RAID、lvm)
- Spring实战笔记——Bean的高级装配
- 百练2806:公共子序列题解
- 12. 开发工具(make,makefile)
- python unicode转string
- 求树的最大独立集
- 知识点14:数组内存储1-100的不重复随机数问题
- json串的使用与操作