簡體   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