提高找树中心的速度?

时间:2015-01-16 07:55:51

标签: algorithm graph breadth-first-search

昨天制作了这段代码。这段代码应该做的是在图中找到节点与所有其他节点之间的最小距离!例如,在this示例图中,2是与所有其他节点具有最小最大距离的节点。我发现复杂度是O(n *(n * m)),当我有少于5000个节点时,它很好用。我可以解决什么使这个解决方案处理节点> 100 000?我应该使用例如迭代而不是递归吗?

#include <cstudio>
#include <queue>
#include <vector>
int biggest_dist(int n, int v, const vector< vector<int> >& graph)
{ //This function finds the diameter of thegraph
int INF = 2 * graph.size(); // Bigger than any other length
vector<int> dist(n, INF);

dist[v] = 0;
queue<int> next;
next.push(v);

int bdist = 0; //biggest distance
while (!next.empty()) {
    int pos = next.front();
    next.pop();
    bdist = dist[pos];

    for (int i = 0; i < graph[pos].size(); ++i) {
        int nghbr = graph[pos][i];
        if (dist[nghbr] > dist[pos] + 1) {
            dist[nghbr] = dist[pos] + 1;
            next.push(nghbr);
        }
    }
}

return bdist;
}


Will the solution be efficient enough to solve more than 100 000 R under 1sec?

1 个答案:

答案 0 :(得分:0)

如果您的图表是树,则可以使用更好的O(n)算法。在一般情况下,我不知道更好的算法。

计算每个节点的程度。删除具有最小程度的所有节点(最初的叶节点)并更新其相邻节点的度数(现在将成为叶节点本身)。这样做直到只剩下一个节点(或两个节点)。这将是你的答案。