c++ 拓扑图排序

xriantvc  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(130)

我正在尝试实现一个拓扑图排序,我的程序正在编译,但是我没有得到一个填充向量。我已经尝试运行调试器来跟踪我的变量去哪里,我不太确定为什么。目前,我已经做了一个图形数据结构,它包含一个顶点向量。这是在我生成一个新图形时生成的(std::向量顶点;)
我的图是这样的结构:

lass Graph {
    struct Edge{
        int dest = -1;
        Edge* next = nullptr;
        Edge(int dest, Edge* next) : dest(dest), next(next){};
        ~Edge() {delete next;}
    };

    struct vertex{
        int id =0;
        int degree = 0;
        int colour = 0;

        vertex* next  = nullptr;
        vertex* previous = nullptr;

    };

    Edge** edges = nullptr;
    std:: vector<vertex> vertices;
    std:: vector<vertex*> ordering;

所有这些都是在图形生成过程中设置的。
我真的很感激任何帮助与此排序。

void Graph::myOwnOrderingHelper(int v, bool *visited, std::stack<vector<vertex*>> &Stack) {

    vector<vertex*> hope;

    visited[v] = true;

    for (int i = 0; i < vertices[v].degree; i++) {
        int neighbour = vertices[v].id;

        if (!visited[neighbour]){
            myOwnOrderingHelper(i, visited, Stack);
            cout << vertices[v].next->id;
            hope.push_back(vertices[v].next);
        }
    }

    Stack.push(hope);
}

void Graph::myOwnOrdering() {
    std:: stack<vector<vertex*>> Stack;
    bool* visited = new bool[size];

    for(int i  = 0; i < size; i++){
        visited[i] = false;
    }

    for (int i = 0; i < size; i++){
        if (visited[i] == false){
            myOwnOrderingHelper(i, visited, Stack);
        }
    }

    while (Stack.empty() == false){
        std::vector<vertex*> temp = Stack.top();

        for(int i = 0; i < temp.size(); i++){
            cout << temp[i]->degree << endl;
            ordering.push_back(temp[i]);
        }

        Stack.pop();
    }

}
rt4zxlrg

rt4zxlrg1#

看看这个代码:

for (int i = 0; i < vertices[v].degree; i++) {
    int neighbour = vertices[v].id;

    if (!visited[neighbour]){

每次通过这个for循环,neighbour的值总是相同的。
无论你的for循环要完成什么(你的代码没有文档记录,所以不容易猜测),它实际上总是一遍又一遍地做完全相同的事情。

dly7yett

dly7yett2#

这里有一些不必要的复杂性,使算法变得模糊不清。

#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

class Graph {
public:
  struct Vertex {
    std::vector<int> children;
  };

  // Add a vertex and return its index.
  int add_vertex() {
    int ix = vertices.size();
    vertices.push_back(Vertex());
    return ix;
  }

  // Add an edge from vertex a to b, both given by their indices.
  void add_edge(int a, int b) {
    vertices[a].children.push_back(b);
  }

  // Return a vector of vertex indices in topo order.
  std::vector<int> topo_sort() {
    std::set<int> visited;
    std::vector<int> result;

    // The fun happens here. Return the reverse of a dfs post order visit.

    return result;
  }

private:
  std::vector<Vertex> vertices;

  // Recursive helper.
  void topo_sort(int i, std::set<int>& visited, std::vector<int>& result) {
    // And yet more fun here.
  }
};

int main() {
  Graph g;
  int v0 = g.add_vertex();
  int v1 = g.add_vertex();
  int v2 = g.add_vertex();
  int v3 = g.add_vertex();
  int v4 = g.add_vertex();
  g.add_edge(v0, v1);
  g.add_edge(v0, v2);
  g.add_edge(v0, v4);
  g.add_edge(v1, v4);
  g.add_edge(v2, v4);

  std::vector<int> sorted = g.topo_sort();
  for (int i: sorted) std::cout << i << ' ';
  std::cout << std::endl;
  return 0;
}

有了它,就可以通过添加6行来实现拓扑排序。
提示:当你在一个你可以控制输入数据的小程序中遇到意想不到的行为时,添加跟踪打印cerr << ...通常比设置调试器更容易,特别是当你是编程新手的时候。

相关问题