繁体   English   中英

有向图实现

[英]Directed graph implementation

我需要在C ++中实现一个有向图(有向图),作为作业的一部分,而我在如何表示顶点和边数据类型方面遇到一些问题。
谁能给我指出一个实现此示例的示例或简单的c ++类,以便我可以对其进行研究并从那里扩展?

我已经用谷歌搜索了一下,但是我只发现了使用Boost或其他库的结果,我只需要一些不依赖任何库的简单东西。

谢谢。

用数据结构表示有向图的主要方法有两种:

以节点为中心 此方法将每个节点表示为程序中的对象,并且每个节点都包含有关其链接到的其他节点的信息。 其他节点可以像在当前节点和目标节点之间存在有向边的节点列表一样简单。

边缘为中心 此方法将每个边缘表示为程序中的对象,并且每个边缘包含有关其连接的节点的信息。 在有向图中,每个边将只有一个“源”和“目标”节点(如果考虑自循环,则可能是同一节点)。 此方法实质上是有序对的列表。

根据您要解决的问题,这两种基本形式之一最终将是最合适的。 更具体的算法可能需要向上述基本结构添加更多信息,例如从当前节点可到达的所有节点的列表。

松散地,有两种简单的表示图的方式:

  1. 连接矩阵
  2. 列表清单。

每个都有优点/缺点,取决于应用程序。

#2将涉及很多指针摆弄。

在进行图转换时,#1通常更易于使用。

无论哪种情况,您都将具有以下内容:

template<typename T>
class node
{
   public:
   T data;
};

列表类的矩阵和列表将指向动态分配的node

这意味着您将拥有一个graph类和一个node类。

尝试将vector< NodeType >multimap< NodeType *, EdgeType>

multimap不支持下标[ x ]因此您需要使用edges.lower_bound()代替。

另外, map< pair< NodeType *, NodeType * >, EdgeType >可以帮助查找给定两个节点的边。 我在一个非常繁重的程序中使用了它。

这是第一个建议的示例:

struct NodeType {
    int distance;
    NodeType( int d ) { distance = d; }
};
struct EdgeType  {
    int weight;
    NodeType *link;
    EdgeType( int w, NodeType *l ) { weight = w; link = l }
};

vector< NodeType > nodes;
nodes.reserve( 3 );
nodes.push_back( NodeType( 0 ) );
nodes.push_back( NodeType( 0 ) );
nodes.push_back( NodeType( 0 ) );

multimap< NodeType *, EdgeType > edges;
edges.insert( make_pair( &nodes[0], EdgeType( 4, &nodes[2] ) ) );
edges.insert( make_pair( &nodes[0], EdgeType( 1, &nodes[1] ) ) );
edges.insert( make_pair( &nodes[2], EdgeType( 2, &nodes[0] ) ) );

for ( multimap< NodeType *, EdgeType >::iterator iter = edges.lower_bound( &nodes[1] ),
  end = edges.upper_bound( &nodes[1] ); iter != end; ++ iter ) {
    cerr << "1 connects to " << iter->second.link - nodes.begin() << endl;
}

这份大学论文可能会对您有所帮助。

它不是最完整的,但也许可以给您一个想法。 我发现它非常有用,也可以用于演讲,因此没有抄袭任何人不做的风险。

template<class T>
class node
{
public:
    T data;
    vector<node<T>*> edges;
}

您很可能还希望存储所有节点的list<node<dataType>*>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM