在c ++中实现GRaph ADT

时间:2010-09-18 10:36:39

标签: c++ graph

我正在尝试在c ++中实现Graph ADT,这里是代码

#include <iostream>
using namespace std;
struct Edge{

    int v,w;
    Edge( int t=-1,int k=-1):v(t),w(k){}

};
class Graph {

public:
    Graph(int,bool);
    ~Graph();
    int V() const;
    int E() const;
    bool directed() const;
    int remove(Edge);
    int insert(Edge);
     bool edge(int,int);
      class AdjIterator{

           public:
AdjIterator(const Graph&,int);
                int beg();
                int nxt();
                bool end();


      };


};
int main(){




     return 0;


}

根据代码的性能,这种实现有多好? 编辑: 我已添加此代码

template<class Graph>
vector<Edge> edge(Graph& G){
    int E=0;
    vector<Edge>a(G.E());
      for (int v=0;v<G.V();v++){
          typename Graph::AdjIterator A(G,v);
          for (int w=A.beg();w!=A.end();w=A.nxt())
              if (G.directed() || v<w)
  a[E++]=Edge(v,w);

      }

      return a;
}

2 个答案:

答案 0 :(得分:2)

您显示的代码中没有太多的实现,只有界面。

表示图表的另一种主要方式是adjacency matrix

表示图表的哪种方式更好取决于您的应用程序。

答案 1 :(得分:0)

有几种表示图形的方法。

  1. 邻接清单
  2. 邻接矩阵
  3. 边缘列表(这是您的实现似乎)。
  4. 实施的选择实际上取决于您将使用它的目的。对于稀疏图,邻接列表非常快速且紧凑,并且对于大多数算法而言通常是优选的。邻接矩阵通常更容易实现,并且一些算法(如Flowd-Warshall所有对最短路径算法)需要它。当您需要的只是边缘时,边缘列表非常有用,例如在使用Kruskal算法的实现中。

    很难说这个特定的实现是否适合您的目的,而不知道您将使用它是什么。