我们如何表示边缘列表,因为我们有一个带有节点和边缘的图形。我们没有谈论邻接列表

时间:2011-01-18 16:12:37

标签: c list graph

什么是边缘列表?不是邻接列表.. 我们如何在C编程中表示边缘列表,前提是我们给出了一个包含节点和边的图?

2 个答案:

答案 0 :(得分:0)

这是基础结构

struct Edge
{
    int id;
    int weight; // If you need one
    vector<Edge *> neighbours; // List of references on your neightbours
}

vector<Edge> graph;

但迈克尔注意到它确实看起来像个作业:)看看启动图库。

更新 C版

struct Edge
{
    int id;
    int weight; // If you need one
    Edge *next; // Next edge in the list
    Edge *neighbours; // List of neightbours
}

Edge *graph;

答案 1 :(得分:0)

使用边缘列表的定义here,并假设无向边,模拟“人”表示将是一个很好的第一次尝试:

typedef struct UndirectedEdge {
    int ends[2];
};

您的顶点全部在int范围内编号。如果他们被指示:

typedef struct DirectedEdge {
    int from;
    int to;
}

根据需要添加其他属性,其类型适合您的问题:

typedef struct WeightedEdge {
    size_t from;
    size_t to;
    double weight;
}

请注意,不需要顶点列表,除非将整数顶点索引映射到人类可读标签(如果它们存在于初始问题中)。此外,您应该为边缘列表定义合适的比较函数,以确保边缘的唯一性,具体取决于图形的属性,例如定向性。

typedef struct EdgeList {
    size_t edge_count;
    EdgeType *edges;
}

_Bool undirected_edge_equal(UndirectedEdge *this, UndirectedEdge *other) {
    return this->ends[0] == other->ends[0] && this->ends[1] == other->ends[1]
        || this->ends[0] == other->ends[1] && this->ends[1] == other->ends[0]
}

_Bool directed_edge_equal(DirectedEdge *this, DirectedEdge *other) {
    return this->from == other->from && this->to == other->to;
}