C++ vector实现邻接表存图

        邻接表可以用链表实现,也可以用vector来实现(如果你用的编程语言是C++的话)。这里来讲解下如何使用vector来实现邻接表。

以下图为例:

用来讲解的无向图
图对应的邻接表示意图

刚开始,初始化一个vector数组Adj[N],N为顶点个数。其中每一个Adj[i]都分别是一个变长数组vector,使得存储空间只与图的边数有关。

vector<未知类型> Adj[N];

接下来,为了同时存放边的终点编号和边权值,建立一个结构体Node,用来存放每条边的终点编号和边权:

struct Node{
    int v;    //边的终点编号
    int w;    //边权
};

此时vector邻接表中的元素类型就是Node型的:

vector<Node> Adj[N];

接下来就是向vector中添加图的边了。比如添加从1号到3号顶点的有向边,边权为4:

Node temp;
temp.v = 3;
temp.w = 4;
Adj[1].push_back(temp);

当然,有一种更快的写法来进行加边操作:定义结构体Node的构造函数:

struct Node{
    int v, w;
Node(int _v, int _w) : v(_v), w(_w) {} //构造函数
}

这样就可以不定义临时变量temp来实现加边操作:

Adj[1].push_back(Node(3, 4));

C++ vector实现邻接表存图就讲解到这里。

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
邻接表是一种表示图的数据结构,其中每个节点都对应着一个链表,储与其相邻的节点。使用vector实现邻接表的步骤如下: 1. 定义一个vector<vector<int>>类型的变量adj_list,其中adj_list[i]表示与节点i相邻的节点列表。 2. 对于每个节点i,将其相邻的节点储在adj_list[i]中,可以使用push_back()函数将相邻节点逐个加入adj_list[i]中。 下面是一个简单的使用vector实现邻接表的示例代码: ```c++ #include <iostream> #include <vector> using namespace std; int main() { int n, m; // n表示节点数,m表示边数 cin >> n >> m; vector<vector<int>> adj_list(n); // 定义邻接表 for (int i = 0; i < m; ++i) { int u, v; // u, v表示一条边的两个端点 cin >> u >> v; adj_list[u].push_back(v); // 将v加入u的邻接表中 adj_list[v].push_back(u); // 将u加入v的邻接表中(无向图) } // 遍历邻接表输出 for (int i = 0; i < n; ++i) { cout << "Node " << i << " is adjacent to: "; for (int j = 0; j < adj_list[i].size(); ++j) { cout << adj_list[i][j] << " "; } cout << endl; } return 0; } ``` 这段代码读入了节点数n和边数m,然后使用vector<vector<int>>类型的变量adj_list表示邻接表。对于每条边,使用push_back()函数将相邻节点加入对应的邻接表中。最后遍历邻接表输出结果。 需要注意的是,这里使用的是无向图的邻接表实现方式,如果是有向图,需要分别将每条边的起点和终点加入对应节点的邻接表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值