我需要在c ++中实现有向图(有向图)作为家庭作业的一部分,我在如何表示顶点和边数据类型方面存在一些问题。
任何人都可以请一个例子或一个简单的c ++类实现这个,所以我可以研究它并从那里扩展?
我已经google了一下,但我只发现了使用Boost或其他库的结果,我只需要一些不依赖于任何库的简单。
谢谢。
答案 0 :(得分:29)
使用数据结构表示有向图有两种主要方式:
以节点为中心。此方法将每个节点表示为程序中的对象,每个节点包含有关其链接到的其他节点的信息。其他节点可以像当前节点和目标节点之间存在有向边的节点列表一样简单。
以边缘为中心。此方法将每个 edge 表示为程序中的对象,每个边包含有关其连接的节点的信息。在有向图中,每个边将只有一个“源”和“目标”节点(如果您正在考虑自循环,则可能是相同的节点)。该方法基本上是有序对的列表。
根据您正在解决的问题,这两种基本形式中的一种最终将是最合适的。更具体的算法可能需要向上述基本结构添加更多信息,例如,从当前节点可到达的所有节点的列表。
答案 1 :(得分:3)
很容易,有两种直接表示图形的方法:
每种都有优点/缺点,具体取决于应用程序。
#2将涉及大量指针摆弄。
在进行图形转换时,#1通常更容易使用。
在任何一个中,你都会有这样的东西:
template<typename T>
class node
{
public:
T data;
};
矩阵和列表类列表将指向动态分配的node
。
这意味着您将拥有graph
班级和node
班级。
答案 2 :(得分:2)
使用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;
}
答案 3 :(得分:0)
这university paper可能会对您有所帮助。
这不是最完整的,但也许给你一个想法。我发现它非常有用,它也适用于讲座,因此没有任何不应该复制的风险。
答案 4 :(得分:0)
template<class T>
class node
{
public:
T data;
vector<node<T>*> edges;
}
您很可能还希望存储所有节点的list<node<dataType>*>
。