繁体   English   中英

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

[英]Finding max flow between two nodes on graph

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

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

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

任何帮助,将不胜感激。

不确定您对唯一路径的规则是什么;

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()
    ...
}

找到流量最大的路径等同于找到流量最小的边缘最大化的路径。 因此,您可以使用一些寻路算法并将其扩展以跟踪路径上看到的最低边缘容量。 对于DFS,您甚至可以保持一个下限,这是您迄今为止所看到的最大容量路径。 然后,您不必在搜索时考虑容量较小的任何边缘,因为具有这种边缘的任何路径都不能具有比您已经找到的路径更高的容量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM