不用vector的邻接表的写法

在遇到大数据问题导致C++ STL vector函数卡顿时,可以手动实现邻接表。通过定义数组head[]和结构体存储边的信息,描述了如何添加边、查询节点连接以及遍历整个图的过程。

做题时有时会碰到一些非人类的数据会卡c++STL函数库里的vector函数,因此不得不自己手写一个邻接表,写法和用法如下:

首先我们需要定义一个数组 head[]

int head[maxn];
//head[i]表示节点i所连的最后一条边的编号(这里的最后指输入数据中最后加进来的边)

其次需要定义一个结构体来存贮边的信息

struct node{
    int v,w,next;
}edge[maxn*2];//此处的edge表示的是某一条边的信息 
//edge[i].v表示编号为i的边是一条指向节点v的边
//edge[i].w表示编号为i的边所带有的权值
//edge[i].next

edge[i].next文字描述相当麻烦,用图表示如下
这里写图片描述
我们可以看到x,y,z为边的编号,u,v1,v2,v3为点的编号,那么

非常好的问题! > **“全局作用域定义就不能用二维 vector 吗?我要邻接表建图”** ✅ **当然可以!而且推荐这样做。** --- ## ✅ 回答核心: ### ✔️ 完全可以在**全局作用域使用 `vector<vector<int>>` 来建邻接表**,并且这是 **更现代、更安全、更灵活的写法**。 你完全没有必要为了“必须在全局定义”而选择老旧的 `vector<int> v[10010]` 数组形式。`vector<vector<int>>` 一样可以定义在全局,甚至更好。 --- ## ✅ 示例对比:两种全局邻接表写法 ### 方式 1:旧风格 —— C 风格数组(不推荐) ```cpp #include <iostream> #include <vector> using namespace std; const int MAXN = 10010; vector<int> adj[MAXN]; // 全局数组 of vectors int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } return 0; } ``` 📌 缺点: - 大小固定为 `MAXN`,不能动态调整; - 如果 `MAXN` 太大但实际用得少,浪费内存; - 不够“C++ 风格”,缺乏灵活性。 --- ### 方式 2:新风格 —— 全局 `vector<vector<int>>`(✅ 推荐) ```cpp #include <iostream> #include <vector> using namespace std; const int MAXN = 10010; vector<vector<int>> adj(MAXN); // 全局 vector of vectors! int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } return 0; } ``` ✅ 优点: - 和上面功能完全相同; - 依然是全局变量,所有函数都能访问; - 内存在堆上分配,不会栈溢出; - 更符合现代 C++ 实践; - 可以随时通过 `adj.resize(new_size)` 动态扩展(即使全局); --- ## 🔁 进阶技巧:运行时决定大小 如果你不知道节点数 `n` 是多少(比如输入决定),也可以先声明为空,主函数中再初始化: ```cpp #include <iostream> #include <vector> using namespace std; vector<vector<int>> adj; // 全局声明,未初始化 int main() { int n, m; cin >> n >> m; adj.resize(n + 1); // 在 main 中动态设置大小 for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } return 0; } ``` 📌 这种方式最灵活,适用于 OJ 刷题或算法竞赛中输入不确定的情况。 --- ## ❓为什么有人还在用 `vector<int> adj[MAXN]`? 历史原因和习惯: - 很多老代码、ACM 模板这么写; - 看起来“简单直接”; - 在全局下其实也安全(不占栈空间); 但这并不代表它是**最佳实践**。 --- ## ✅ 总结:你应该怎么做? | 目标 | 推荐做法 | |------|----------| | 建图(邻接表) | 使用 `vector<vector<int>> adj(n)` 或全局 `resize(n)` | | 全局访问需求 | 可以将 `vector<vector<int>>` 定义为全局变量 | | 安全性要求高 | ✅ 避免任何大数组放栈上,优先堆分配 | | 竞赛编程 | 虽然 `adj[MAXN]` 常见,但建议转向 `vector<vector<int>>` | > 💡 **结论:完全可以、也应该在全局使用 `vector<vector<int>>` 来建邻接表。它比 `vector<int> adj[MAXN]` 更好、更安全、更现代。** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值