【数据结构】存图 | vector邻接表 | 二维数组邻接矩阵 | 链式前向星

6 篇文章 0 订阅
6 篇文章 0 订阅
本文探讨了三种图的存储方式:邻接矩阵、vector邻接表和链式前向星。邻接矩阵适用于稠密图,但会浪费大量内存;vector邻接表节省空间,适用于稀疏图;链式前向星则是更优选择,尤其在存储大量边时。示例代码展示了如何使用C++实现这三种结构。
摘要由CSDN通过智能技术生成

存图(vector邻接表、邻接矩阵、链式前向星)

除了特殊情况必须使用特定的存储方式,遵循以下优先级

链式前向星 > vector邻接表 > 邻接矩阵

临界矩阵

邻接矩阵就是用一个二维数组表示两个点之间的关系。

例如点u到点v有权值为w的单项边,则设 mp[u][v] = w;

便可以通过获取 mp[][] 的值知道两点是否有边,边权为多少

这种存储方式会占用很多不必要的内存空间

vector邻接表

#include<bits/stdc++.h>
using namespace std;
struct Edge {
	int v, w;
};
vector<Edge>mp[10000];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		mp[u].push_back({ v, w });
	}
}

链式前向星

存储每个点的头部,通过头插法的方式连接,然后找到头部依次向下遍历

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
// 创建边结构
struct E{
	int v, w, next;
	// 下一个点,边权,当前边的上一个边
}Edge[MAXN];
int tot, head[MAXN];

// 建边
void AddEdge(int u, int v, int w) {
	Edge[tot].v = v;
	Edge[tot].w = w;
	Edge[tot].next = head[u];
	head[u] = tot++;
}

int main() {
	// 初始化head
	memset(head, -1, sizeof(head));

	// 建边
	int t; cin >> t;
	for (int i = 0; i < t; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		AddEdge(u, v, w);
	}

	// 遍历 u 连接的所有边
	int u; cin >> u;
	for (int i = head[u]; ~i; i = Edge[i].next) {
		cout << Edge[i].v << " " << Edge[i].w << endl;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MuShan-bit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值