You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

邻接表实现图的C++代码问题:非连续节点输出异常求助

问题根源
  • 邻接表存储方式局限:代码里用vector<int> adj[10000]固定大小数组存邻接表,这种结构强制要求节点编号必须连续且落在0~9999范围内,完全无法适配非连续的节点编号(比如2、4、5这类不连续编号)。
  • 打印逻辑错误:print函数里用for(int i=0;i<n+1;i++)循环遍历节点,这里的n是用户输入的节点总数,不是节点的最大编号。比如节点是2、4、5(共3个节点,n=3),循环会遍历0~3,导致:
    • 打印出不存在的节点0、1、3的空邻接表
    • 实际存在的节点4、5完全被遗漏,根本不会被打印

另外代码引入了unordered_map头文件却未使用,属于冗余代码。

修复方案

改用unordered_map<int, vector<int>>作为邻接表存储结构,它可以自动适配任意整数类型的节点编号(连续或非连续均可),同时调整打印逻辑,直接遍历map中所有存在的节点即可。

修复后的完整代码:

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;

class graph{
public:
    unordered_map<int, vector<int>> adj;

    void insert(int u, int v, bool direction) {
        adj[u].push_back(v);
        // direction为1表示无向图,双向添加边
        if(direction == 1) {
            adj[v].push_back(u);
        }
    }

    void print() {
        // 遍历所有存在的节点
        for(auto& pair : adj) {
            cout << pair.first << "->";
            for(int neighbor : pair.second) {
                cout << neighbor << ",";
            }
            cout << endl;
        }
    }
};

int main() {
    int n;
    cout << "Enter no of nodes" << endl;
    cin >> n;
    cout << "Enter no of edges" << endl;
    int m;
    cin >> m;
    graph g;
    for(int i=0; i<m; i++) {
        int u, v;
        cin >> u >> v;
        // 1表示无向图,0表示有向图
        g.insert(u, v, 1);
    }
    g.print();
    return 0;
}
额外说明
  • 修复后的代码不再依赖节点编号的连续性,不管节点是0、1、2还是2、4、5这类非连续编号,都能正确存储和打印邻接表
  • print函数不再需要传入节点总数,直接遍历unordered_map的键值对即可输出所有存在的节点及其邻接节点
  • 移除了未使用的list头文件,精简了代码

内容的提问来源于stack exchange,提问作者Princy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:05:48