我正在尝试在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;
}
答案 0 :(得分:2)
答案 1 :(得分:0)
有几种表示图形的方法。
实施的选择实际上取决于您将使用它的目的。对于稀疏图,邻接列表非常快速且紧凑,并且对于大多数算法而言通常是优选的。邻接矩阵通常更容易实现,并且一些算法(如Flowd-Warshall所有对最短路径算法)需要它。当您需要的只是边缘时,边缘列表非常有用,例如在使用Kruskal算法的实现中。
很难说这个特定的实现是否适合您的目的,而不知道您将使用它是什么。