当前位置: 首页 > 知识库问答 >
问题:

用C++编制有向图的邻接表

卢聪
2023-03-14

大家好:)今天我正在提高我在图论和数据结构方面的技能。我决定用C++做一个小项目,因为我已经有一段时间没有用C++了。

我想为一个有向图做一个邻接表。换句话说,看起来像:

0-->1-->3
1-->2
2-->4
3-->
4-->

这将是一个有向图,其中V0(顶点0)对V1和V3有一条边,V1对V2有一条边,V2对V4有一条边,如下所示:

V0----->V1---->V2---->V4
 |
 |
 v
 V3 
#include <stdio>
#include <iostream>
using namespace std;

struct graph{
//The graph is essentially an array of the adjList struct.  
node* List[];

};

struct adjList{
//A simple linked list which can contain an int at each node in the list.

};

struct node {
int vertex;
node* next;
};

int main() {
//insert cool graph theory sorting algorithm here
}

共有1个答案

长孙弘壮
2023-03-14

您可以在节点中使用向量作为邻接表。

class node {
  int value;
  vector<node*> neighbors;
 };

如果在编译时已知该图,则可以使用数组,但它“有点”困难。如果您只知道图的大小(在编译时),您可以做类似的事情。

template<unsigned int N>
class graph {
  array<node, N> nodes;
 }

要添加邻居,可以执行如下操作(不要忘记从零开始编号):

nodes[i].neighbors.push_back(nodes+j); //or &nodes[j]
if(i != number_of_last_element_in_list) //neighbors.size() - 1
 swap(neighbors[i], neighbor.back());
neighbors.pop_back();
//creation of nodes, as previously
constexpr unsigned int N = 3;
array<node,N> nodes; //or array<node, 3> nodes;
//creating edge (adding neighbors), in the constructor, or somewhere
nodes[0].neighbors = {&nodes[1]};
nodes[1].neighbors = {&nodes[0], &nodes[1]};
//adding runtime, i,j from user, eg. i = 2, j = 0
nodes[i].neighbors.push_back(&nodes[j]); //nodes[2].neighbors = {&nodes[0]};

当顶点数可能发生变化时,可以使用向量节点(vector )代替数组,只需调整大小即可。其余的保持不变。例如:

vector<node> nodes(n); //you have n nodes
nodes.emplace_back(); //you added new node, or .resize(n+1)
//here is place to runtime graph generate
//as previously, i,j from user, but now you have 'vector<unsigned int>' in node
nodes[i].neighbors.push_back(j);

但是你不能删除一个节点,这违反了编号!如果要擦除某些内容,应该使用指针的list(list )。否则,必须保留不存在的顶点。在这里,命令很重要!

关于nodes.emplace_back()行;//添加节点,使用没有指针的图是安全的。如果你想使用指针,你不应该改变图形的大小。在添加顶点时,当vector将被复制到新的位置(空间不足)时,您可能会意外地更改某些节点的地址。

node* const graph = new node[size]; //<-- It is your graph.
//Here no address change accidentally.
 类似资料:
  • 作为一项练习,我必须建立一个卫星导航系统,规划从一个位置到另一个位置的最短和最快路线。它必须尽可能快,而不需要使用太多内存。 我很难决定使用哪种结构来表示图形。我知道矩阵更适合密集图,列表更适合稀疏图。我更倾向于使用列表,因为我认为添加顶点将是这个程序中最累人的部分。 我只是想听听你们的意见。如果我把一个典型的路线图看作一个图形,其中不同的位置是节点,道路是边缘。你认为它是稀疏的还是密集的?在这种

  • B)设是带有向图(无环多边)的一个邻接矩阵,其中是边到的一个权重。如果没有这样的边并且对于evrey我们有。矩阵。槽表示什么?最小权重?还是...? 知道吗? 编辑:我的意思是这些算法在图中找到哪一个?找到最大重量?最小重量?什么也没找到?

  • 在书中,他们做过这样的宣示: 我应该如何将下面图的输入作为邻接表并输出它的邻接表表示?假设,edge的每个成本是10。

  • `使用命名空间标准;

  • 本文向大家介绍C++实现图的邻接矩阵表示,包括了C++实现图的邻接矩阵表示的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现图的邻接矩阵表示代码,供大家参考,具体内容如下 1.遇到的问题:教材中写着子类Graphmtx(我用GrapMatrix)继承基类Graph 但是我在子类GraphMatrix中使用父类Graph的保护成员属性:maxVertices 显示没有声明(如下