在我的图形实现中查找边数并执行拓扑排序

时间:2015-05-02 08:30:38

标签: c++ graph graph-algorithm topological-sort

我过去几天一直致力于图表实施。所有这一切对我来说都是新的,我被困在我实施的两个部分。我正在从输入文件中实现课程的图表。从文件中,我可以确定哪些课程是其他课程的先决条件。然后我创建了一个以图表为节点的图表,以及连接作为先决条件的边缘的边缘。我还想找到节点和边的总数,并在图上执行拓扑排序(我稍后将向边添加权重)。这是我的实施。

Digraph.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(); 

};

Digraph.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即可。我已经确认这是正常的。我迷失了如何返回图表中的边数。它似乎很简单,但我尝试的一切都不起作用。其次,我完全迷失了如何在此图上执行拓扑排序。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

一种简单的方法是迭代图中的所有顶点,将它们的邻居计数加起来然后除以2:

int Digraph::getNumEdges(){
     int count = 0;
     for (const auto & v : work) {
         count += v.second->adjacency.size();
     }
     return count / 2;
}

要使用基于for循环的范围,您需要使用c ++ 11。使用命令行上的--std=c++11 g ++。

修改 我刚刚意识到你有一个有向图,你可能想要为每个方向计算一个。在这种情况下:不要除以2!

int Digraph::getNumEdges(){
     int count = 0;
     for (const auto & v : work) {
         count += v.second->adjacency.size();
     }
     return count;
}