Последние несколько дней я работал над реализацией графа. Все это действительно ново для меня, и я застрял на двух частях своей реализации. Я реализую орграф курсов из входного файла. Из файла я могу определить, какие курсы необходимы для других курсов. Затем я создаю орграф с курсами в качестве узлов и ребрами, соединяющими курсы, которые являются обязательными. Я также хочу найти общее количество узлов и ребер и выполнить топологическую сортировку графа (позже я буду добавлять веса ребрам). Вот моя реализация.
Диграф.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, даже если ребро уже существует. - person Dimitri Schachmann   schedule 02.05.2015