【发布时间】:2015-01-16 23:45:19
【问题描述】:
所以这个函数,maximum_dist,找到一个图的直径(任务中给定的图总是一棵树)。
我希望它找到的是找到直径的中心,即与所有其他节点的最大距离最小的节点。
我“有点”理解我们可以通过跟踪每个节点的父节点来找到从u 到 t 的路径(u 和 t 之间的距离是直径)来做到这一点的想法.从那里我选择u和t中间的节点?我的问题是如何在这里为这个函数实现它?这会使其输出该图的节点 2 吗?
int biggest_dist(int n, int v, const vector< vector<int> >& graph)
//n are amount of nodes, v is an arbitrary vertex
{ //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;
}
【问题讨论】:
-
对于树,您可以使用一个可爱的算法:同时删除图中的所有叶子并重复此操作,直到剩下一两个节点。那些剩余的节点就是中心。这对你有用吗,还是你特别想使用上面的代码?
-
呃……你可以把它当作一个图形和从 u 到 t 的 dfs,然后返回直径/2 次。或者,如果由于某种原因它作为树真的更方便,你可以根树,找到所有深度,然后找到下节点的(直径/2)th 父节点......(我认为?)编辑:你的代码如何求图的直径,好像只是找到离节点v最远的距离?
标签: graph breadth-first-search