【发布时间】:2015-05-02 08:30:37
【问题描述】:
过去几天我一直在研究图形实现。所有这一切对我来说都是新的,我被困在我的实施的两个部分。我正在从输入文件实现课程的有向图。从文件中,我可以确定哪些课程是其他课程的先决条件。然后,我创建一个有向图,其中课程作为节点,边连接作为先决条件的课程。我还想找到节点和边的总数,并对图执行拓扑排序(稍后我将向边添加权重)。这是我的实现。
有向图.h
class vertex{
public:
typedef std::pair<int, vertex*> ve;
std::vector<ve> adjacency;
std::string course;
vertex(std::string c){
course = c;
}
};
class Digraph{
public:
void addVertex(std::string&);
void addEdge(std::string& from, std::string& to, int cost);
typedef std::map<std::string, vertex *> vmap;
vmap work;
int getNumVertices();
int getNumEdges();
void getTopoSort();
};
有向图.cpp
void Digraph::addVertex(std::string& course){
vmap::iterator iter = work.begin();
iter = work.find(course);
if(iter == work.end()){
vertex *v;
v = new vertex(course);
work[course] = v;
return;
}
}
void Digraph::addEdge(std::string& from, std::string& to, int cost){
vertex *f = (work.find(from)->second);
vertex *t = (work.find(to)->second);
std::pair<int, vertex *> edge = std::make_pair(cost, t);
f->adjacency.push_back(edge);
}
返回work.size 即可轻松查找节点数。我已经确认这工作正常。我不知道如何返回图表中的边数。看起来这很简单,但我尝试的一切都不起作用。其次,我完全不知道如何在这个图上执行拓扑排序。感谢您提供任何帮助。
【问题讨论】:
-
请注意,
Digraph::addEdge可以将新的边从 A 添加到 B,即使已经有边。
标签: c++ graph graph-algorithm topological-sort