三大图的储存——1,邻接矩阵,2,邻接表,3,链式向前星

1,邻接矩阵(最好懂,最简单,最容易挂)

即通过开数组来表示点与点及其边的关系,如arr[i][j]可以表示i点与j点之间的边权为arr[i][j]这个数值

2,邻接表

思想:通过开一个动态数组来储存点与点及其边的关系,充分利用空间

#include <bits/stdc++.h>
using namespace std;
#define ll     long long
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 100;

struct note
{
	int s, p;
};
bool vis[N];//用于标记是否访问过这个点
vector<note>arr[N];

int main()
{
	int n, m;
	cin >> n >> m;
	int u, v, w;
	for (int i = 1; i <= m; ++i)
		{
			cin >> u >> v >> w;
			arr[u].push_back({v, w});//存入一条由u指向v,边权为w的边
			//arr[v].push_back({u,w}); ————  //如果是无向边,再换个方向来一次
		}
	
	
	int tmp=2;//访问的时候可以访问由tmp出发的所有边,可以对其操作
	for(int i=0;i<(int)arr[tmp].size();++i){
		
	}
	
}

3,链式向前星(本质:用链表实现的邻接表)

跟邻接表差不多,但是比邻接表快,因为他是由静态数组组成,邻接表是动态数组。但是邻接表写起来比他好懂,也比他容易

先上代码

struct shu
{
	ll next, to,w;
} edge[N];
void add(ll f, ll t,ll z)
{
	edge[++num].next = head[f];
	edge[num].to = t;
    edge[num].w=z;
	head[f] = num;
}


//经典遍历公式
for (int i = head[u]; i; i = edge[i].next)

1,符号的意义

1,edge[].to存储由f,出发到达的终点,edge[].z表示这条边的权值

2,edge[].next储存上一次以f为起点的边(所以他==head[f],俩者就是等价的,即edge[num].next==edge[head[f]].next,这样看是不是更明显表现出是以f出发的边,head[f]的f表示从f出发的点,head[f]储存上一次以f为起点的边

3,不需要管num,只是暂时储存边的,最后会被替换为

edge[现在的边].next==head[f](上一条以f为起点的边)

edge[i].to==edge[edge[].next].to==edge[上一条以f为起点的边].to==上一条以f为起点的边指向的终点

2,遍历公式:for (int i = head[u]; i; i = edge[i].next)

意思是首先进入以u为开头的最后一条边,如果这个边i不为0(即不存在)的话,下一次,进入以u开头的上一条边(如果存在的话)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在图论中,数据结构用于表示图有三种常见的方法:邻接矩阵邻接表链式前向。 1. **邻接矩阵**:这是一种二维数组(或矩阵)的表示法,其中行代表图中的顶点,列也代表顶点,每个元素(通常是布尔值或整数)表示两个顶点之间是否存在边。如果(i, j)位置的值为1或非零,表示顶点i和j相连;反之则表示不连接。邻接矩阵存储空间占用大,但查找任意两点间是否有边的时间复杂度是O(1),对于稠密图效率高。 2. **邻接表**:这是一种基于链表的数据结构,每个顶点都有一个链表,列表中的节点包含与该顶点相邻的所有其他顶点。这样,对于稀疏图来说,节省了大量空间,因为只存储实际存在的边。查找某个顶点的邻居需要遍历链表,时间复杂度为O(degree),其中degree是顶点的度(即相邻顶点的数量),对查找速度不利。 3. **链式前向**:这是一种特殊的邻接表,通常用于构建树形图或有向无环图(DAG)的拓扑排序。在这种结构中,每个顶点有一条指向其子节点的链,形成一棵树状结构,且所有指向同一个顶点的边都是从父节点到子节点的。相比于一般的邻接表链式前向更直观地反映了图的层次关系,但查找路径可能需要沿着链逐级向前,时间复杂度取决于目标节点的位置。 总结一下,邻接矩阵适合于稠密图,查询速度快,但空间消耗较大;邻接表适用于稀疏图,节省空间,但查找慢;链式前向则常用于特定类型图的快速搜索,并能体现拓扑结构。选择哪种数据结构主要看图的具体特征和应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值