【问题标题】:C/C++ implementation of a Directed Acyclic Graph有向无环图的 C/C++ 实现
【发布时间】:2023-03-24 16:11:01
【问题描述】:

作为新手,我正在尝试使用 C(或 C++)生成 DAG。

struct Node
{
    Link *incomingEdge, *outgoingEdge;
};

struct Link
{

    Node *origin, *destination;

};

在我的代码中,每个节点只有一个传入和传出边。但是,一个节点可能有多个入射边。此外,每个节点的事件边数可能会发生变化。

如何为每个节点生成不同数量的指针?

假设我有;

nodeA 有 5 个输入边和 4 个输出边。 nodeB 有 3 个输入边和 6 个输出边。

所以每个节点的指针数量都在变化。

【问题讨论】:

  • '如何为每个节点生成不同数量的指针?' generate 是什么意思?您是在问,如何为事件边保存多个指针?然后你可以使用std::vector<Link*> incidentEdges;之类的东西。
  • 您可能需要考虑使用adjacency list。另外:如果您打算使用一种结构而不是另一种结构,那么可能程序员.se 可能是一个更好的选择。
  • 好吧,我想经常删除节点和边并添加新的..这就是我不想考虑邻接表的原因。
  • 一个矢量容器会很好,但是如果我想经常通过矢量搜索,这是一种有效的方法吗?

标签: c++ c algorithm graph graph-theory


【解决方案1】:

考虑使用指针向量

std::vector<Link *> incomingEdge;

【讨论】:

  • 我想我明白了。但是如果我想经常通过incomingEdge向量搜索它是否有特定的边缘,我需要使用find()函数吗?还是有其他有效的方法?
  • 如果您需要经常查找特定边,请使用 std::map 或 std::set,具体取决于您的数据结构。这两个容器都有 find 成员函数
  • 但是如何在 Node 结构中声明这个向量(指向另一个结构链接)。我的编译器没有工作。
  • 查找确实有效。如果每个节点的边数很大,则可能首选映射。如果这还不够快,那么将指针散列到某种贝叶斯事物中可能会起作用。我建议从最简单的想法开始,让它发挥作用,然后看看性能。这可能已经足够了。
【解决方案2】:

这取决于你需要什么。该图完全由边描述,因此简单的答案是,从节点定义中省略 *incomingEdge, *outgoingEdge。 但是对于您要实现的算法,来自std:: 的相邻节点的链表或适当的容器可能会更好。

【讨论】:

  • 好吧,图是有向的,链接的方向很重要..链表中的节点只能显示*下一个和*上一个节点。但是如果有 5 个 *next 节点?
  • 我的意思是类似于传入和其他邻接的单链表可能看起来像。 struct Link { Link *theEge, *nextIOEdge; };
  • 我真的没明白。你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多