查找图上两个节点之间的最大流量

时间:2014-12-09 01:15:40

标签: c++ data-structures graph

我正在尝试使用递归深度优先搜索找到图形上两个节点之间的所有路径。该图还包含循环,因此我使用数组来跟踪我访问过的节点。然后我想选择最大流量的路径。

我想知道用于存储路径的最佳数据结构是什么。我的图表最多有1000个节点,节点之间最多有10000条道路。

我最初的猜测是指向包含路径的列表的指针数组,尽管存储数组的空间复杂性和遍历数组以查找具有最大流量的路径所需的时间复杂度将是巨大的。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

不确定您对独特路径的规则是什么;

typedef std::list<int> Path;
typedef std::list<Path> Paths;

class Node {
public:
    Node() : visited(false) { }
    bool visited;
    Path edge;
};

const int max_nodes = 1000;
Node nodes[max_nodes];

bool visitNode(Path &out,int node,int target) {
    if (node == target)
        return true;
    Node& n = nodes[node];
    if (n.visited) 
        return false;
    n.visited = true;
    for (Path::iterator it = n.edge.begin(); it != n.edge.end(); it++) {
        if (visitNode(out,*it,target)) {
            out.push_back(node);
            return true;
        }
    }
    return false;
}

void resetNodes() {
    for (int i = 0; i < max_nodes; i++) 
        nodes[i].visited = false;
}

Paths findPaths(int node,int target) {
    resetNodes()
    ...
}

答案 1 :(得分:0)

使用最大流量查找路径等效于查找最大容量边缘最大化的路径。因此,您可以使用一些路径寻找算法并对其进行扩展,以跟踪路径上看到的最低边缘容量。对于DFS,您甚至可以保持下限,这是您目前看到的最大容量路径。然后,您无需在搜索时考虑任何容量较小的边缘,因为具有此类边缘的任何路径都不能具有比您已找到的路径更高的容量。