图的储存与遍历 -- 链式前向星基本原理

本文转自https://blog.csdn.net/qq_41754350/article/details/81082728

一、概述
我们在学习图论的时候学习了一种图的存储结构–二维数组邻接矩阵储存,他虽然可以表达直观,快速访问连接两点的边,但是它占用空间大,只适用于点少的图,所以我们需要一种能够可以存储大型图的东西–链式前向星。
前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度。

二、链式前向星基本原理
首先我们要存入以下一张图:

在这里插入图片描述

点1指向点2、点3、点4。

链式前向星是以边为主的存图方式,我们需要利用结构体来规划边,这会使图变得更加清晰。

首先我们需要建立边的数组edge[ ],一般我们需要它记录多种元素:下一条边的编号,这条边到达的点,这条边的长度


struct Edge
{
	int next;//下一条边的编号 
	int to;//这条边到达的点 
	int dis;//这条边的长度 
}edge[maxm];

其次我们将已知的边加入;


int main()
{
	num_edge=0;//定义边数,后面直接++ 
	scanf("%d%d",&n,&m);//输入点数和边数
	for(int i=1;i<=m;i++)//记录边数 
	{
	scanf("%d%d%d",&u,&v,&d);//输入从哪里来到哪里去权值是多少 
	add_edge(u,v,d);//正存图 
	add_edge(v,u,d);//如果是无向图,就要反存图 
	}	
 
}

我们可以添加一个add函数方便我们添加:

void add_edge(int from,int to,int dis) //加入一条从from到to距离为dis的单向边 
{
	edge[++num_edge].next=head[from]; 
	edge[num_edge].to=to;//将to记录 
	edge[num_edge].dis=dis;//将dis记录 
	head[from]=num_edge;// 
}

可能过这一步有点迷,下面是一个存图的模拟:
在这里插入图片描述
这边模拟走完后,可以得到以下图:
在这里插入图片描述
突发奇想,可能这样比较形象:
在这里插入图片描述
最后一部就是调用,它根据你的题目来决定。但都离不开以下程序核心:

for(int i=head[k];i!=0;i=edge[i].next)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值