在c ++中使用adjaceny-list在图形中添加边

时间:2018-04-15 20:51:44

标签: c++ vector graph adjacency-list

这是我如何定义我的图表,它是针对我正在处理的问题。

    class Vertex;

    Class Edge
    {
        Vertex *org;
        Vertex *dest;
        int traverse_time;
    };
    struct Vertex{
        int id;
        vector<Edge> edges;
        int weight;
    };
    struct Graph{
        vector<Vertex> vertices;
    };

这就是我一直在添加顶点的方法

Graph* g1=new Graph; Vertex* newvertex = addVertex(0); graph1->vertices.push_back(*newvertex);

添加顶点功能可以正常工作但仍然需要

Vertex* addVertex(int id){
Vertex*newVertex = new Vertex;
newVertex->id=id;
newVertex->weight=0;
return newVertex;}

当我尝试向这些顶点添加边时,我遇到了问题。这就是我一直在做的事

org=&(g1->vertices[0]);
dest=&(g1->vertices[1]);
Edge* newedge=addRoad(org,dest,1);
org->edges.push_back(*newedge);
dest->edges.push_back(*newedge);

addEdge函数定义如下:

Edge* addedge(Vertex* j_id1,Vertex* j_id2,int t)
{
    Edge *newedge =new Edge;
    newedge->org=j_id1;
    newedge->dest=j_id2;
    newedge->traverse_time=t;
    return newedge;
}

该功能在org->edges.push_back(*newedge);

之前停止工作

3 个答案:

答案 0 :(得分:2)

使用指向向量元素的指针时必须小心,因为当向量调整大小时(在没有剩余空间时调用push_back),不能保证每个元素仍然会占用相同的元素记忆地址。

相反,请使用 indices

struct Edge
{
    unsigned A, B;  // indices
    int weight;

    Edge(unsigned a, unsigned b, int w) : A(a), B(b), weight(w) {}
};
struct Vertex
{
    int id, weight;
    vector<unsigned> edges;  // edge indices

    Vertex(int i, int w) : id(i), weight(w) {}
};

struct Graph
{
    vector<Vertex> vertices;
    vector<Edge>   edges;   // use a vector for edges too for EZ deallocation

    // make the relevant functions members

    void addVertex(int id)
    {
        // in-place constructor
        vertices.emplace_back(id, 0);
    }
    bool addEdge(unsigned v1, unsigned v2, int t)
    { 
        // check if indices are valid
        if (v1 >= vertices.size() && v2 >= vertices.size())
            return false;

        unsigned newindex = edges.size();  // index of new edge
        edges.emplace_back(v1, v2, t);

        // add this edge's index to endpoints
        vertices[v1].edges.push_back(newindex);
        vertices[v2].edges.push_back(newindex);

        return true;
    }
};

许多其他可能的改进,但这至少应该解决内存访问问题。

答案 1 :(得分:0)

Edge从类更改为结构,或将其属性设为公共,类具有私有成员作为标准,而结构具有公共。

答案 2 :(得分:-1)

您的设计存在几个缺陷,为什么要将Edge定义为:

Class Edge
{
    Vertex *org;
    Vertex *dest;
    int traverse_time;
};

如果将其邻居定义为邻接列表,则顶点之间的关系应该清楚,即:

Class Cost
{
    int traverse_time;
};

struct Vertex{
    int id;
    map<shared_ptr<Vertex>, Cost> neighbours;
    int weight;
};

接下来,当您在解决方案中添加顶点时,请编写:

Edge* newedge=addRoad(org,dest,1);
org->edges.push_back(*newedge);
dest->edges.push_back(*newedge);

由于你的边缘来自于原点,因此对于顶点顶点没有多大意义 - &gt; DEST。