因此,此函数largest_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;
}
答案 0 :(得分:2)
事实上,此功能不计算直径。它计算给定顶点v
的最远顶点。
要计算树的直径,首先需要选择一个任意顶点(比如说v
),然后找到离v
最远的顶点(比方说w
}),然后找到离w
最远的顶点,让我们坐着u
。 w
和u
之间的距离是树的直径,但v
和w
之间的距离(您的功能正在做什么)并不保证是直径
要使你的函数计算直径,你需要让它返回它与距离一起找到的顶点。方便的是,它始终是您处理的最后一个元素,因此只需让您的函数记住它处理的最后一个元素以及与该元素的距离,并将它们返回。然后调用您的函数两次,首先从任意顶点开始,然后从第一次调用返回的顶点调用。
要使其实际找到中心,您还可以记住BFS期间每个节点的父级。为此,请分配一个额外的数组,例如prev
,以及何时执行
dist[nghbr] = dist[pos] + 1;
也做
prev[nghbr] = pos;
然后在第二次调用函数结束时,你可以将bdist / 2次下降到prev中,例如:
center = lastVertex;
for (int i = 0; i + i < bdist; ++ i) center = prev[center];
因此,对函数进行一些调整(使其从v
返回最远的顶点,并返回该路径中间的顶点,而不是直接返回直径),此代码很可能返回树的中心(我只在你的例子中测试它,所以它可能会有一些错误)
pair<int, int> biggest_dist(int n, int v, const vector< vector<int> >& graph)
{
int INF = 2 * graph.size(); // Bigger than any other length
vector<int> dist(n, INF);
vector<int> prev(n, INF);
dist[v] = 0;
queue<int> next;
next.push(v);
int bdist = 0; //biggest distance
int lastV = v;
while (!next.empty()) {
int pos = next.front();
next.pop();
bdist = dist[pos];
lastV = 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;
prev[nghbr] = pos;
next.push(nghbr);
}
}
}
int center = lastV;
for (int i = 0; i + i < bdist; ++ i) center = prev[center];
return make_pair(lastV, center);
}
int getCenter(int n, const vector< vector<int> >& graph)
{
// first call is to get the vertex that is furthest away from vertex 0, where 0 is just an arbitrary vertes
pair<int, int> firstResult = biggest_dist(n, 0, graph);
// second call is to find the vertex that is furthest away from the vertex just found
pair<int, int> secondResult = biggest_dist(n, firstResult.first, graph);
return secondResult.second;
}